1. Bit düzeyinde sola kaydırma
Java ayrıca 3 bitsel kaydırma işlecine sahiptir : Gerçekten ihtiyacınız varsa, bir sayının tüm bitlerini çok basit bir şekilde birkaç konum sola veya sağa kaydırabilirsiniz.
Bir sayının bitlerini sola kaydırmak için, bitsel sola kaydırma operatörüne ihtiyacınız vardır . Bu şekilde yazılır:
a << b
aBitleri kaydırılan sayı nerede ve sayının bbitlerinin kaç kez asola kaydırılacağını gösteren bir sayıdır. Bu işlem sırasında sağ tarafa eklenen düşük dereceli bitler sıfırdır.
Örnekler:
| Örnek | Sonuç |
|---|---|
|
|
|
|
|
|
|
|
Bir basamağı sola kaydırmak, bir sayıyı 2 ile çarpmakla aynı etkiye sahiptir.
Bir sayıyı 16 ile çarpmak ister misiniz? 16, 2 4 ile aynıdır . Böylece 4 rakamı sola kaydırırsınız
2. Bit düzeyinde sağa kaydırma
Bitler ayrıca sağa kaydırılabilir. Bunu yapmak için, bitsel sağa kaydırma işlecini kullanın . Bu şekilde yazılır:
a >> b
aBitleri kaydırılan sayı nerede ve sayının bitlerinin sağa bkaydırılma sayısıdır .a
Örnekler:
| Örnek | Sonuç |
|---|---|
|
|
|
|
|
|
|
|
Bir basamağı sağa kaydırmak, bir sayıyı 2'ye bölmekle aynı etkiye sahiptir.
Bu işlem sırasında, sola eklenen yüksek dereceli bitler sıfırdır, ancak her zaman değil !
İşaretli bir sayının en soldaki bitine işaret biti denir : sayı pozitifse 0; ancak sayı negatifse, bu bit 1.
Bir sayının bitlerini sağa kaydırırken, işaret bitinin değeri de normal olarak kayar ve sayının işareti kaybolur. Buna göre, negatif sayılar için (en soldaki bitin olduğu yerde 1), bu bit özel muamele görür. Bir sayının bitlerini sağa kaydırırken, 0en soldaki bit ise sola a 0, 1en soldaki bit ise sola a eklenir 1.
Ancak yukarıdaki örnekte, sonuç bu gibi görünmüyor. Neden? Çünkü tamsayı değişmezleri s'dir intve aslında . Yani en soldaki bit sıfırdır.0b111111110b00000000000000000000000011111111
Birçok programcı bu sağa kaydırma davranışından bıkmıştır ve sayının her zaman sıfırlarla doldurulmasını tercih eder. Böylece Java başka bir sağa kaydırma işleci ekledi .
Bu şekilde yazılır:
a >>> b
a Bitleri kaydırılan sayı nerede ve sayının bitlerinin sağa b kaydırılma sayısıdır . aBu işleç, sayının işaret bitinin orijinal değerinden bağımsız olarak her zaman sola sıfır ekler a.
3. İşaretlerle çalışmak
Programcılar, bitsel ve kaydırmalı işlemler temelinde neredeyse tamamen yeni bir çalışma alanı yarattı: bayraklarla çalışmak.
Bilgisayarların çok az belleği olduğunda, çok fazla bilgiyi tek bir sayıya sıkıştırmak oldukça popülerdi. Bir sayı, bir bit dizisi olarak ele alındı: bir int, 32 bit ve bir uzun, 64 bittir.
trueÖzellikle mantıksal ( veya false) değerleri saklamanız gerekiyorsa, böyle bir sayıya pek çok bilgi yazabilirsiniz . Single, 64 öğeden oluşan longbir dizi gibidir . Bu bitlere bayrakboolean adı verildi ve aşağıdaki işlemler kullanılarak manipüle edildi:
-
bayrak koymak(belirli bir biti şuna eşit yapın
1) -
bayrağı sıfırla(belirli bir biti şuna eşit yapın
0) -
kontrol bayrağı(belirli bir bitin değerini kontrol edin)
Ve işte bitsel operatörlerle nasıl yapıldığı.
Bayrak ayarlama
Belirli bir biti olarak ayarlamak için 1, bitini ayarlamak istediğiniz sayı ile yalnızca o bitin olduğu özel olarak oluşturulmuş bir sayı arasında bit düzeyinde VEYA işlemi gerçekleştirmeniz gerekir 1.
Örneğin, sayıya sahip olduğunuzu 0b00001010ve 5. biti olarak ayarlamanız gerektiğini varsayalım 1. Bu durumda şunları yapmanız gerekir:
0b00001010 | 0b00010000 = 0b00011010
5. bit zaten bire ayarlanmış olsaydı, o zaman hiçbir şey değişmezdi.
Genel olarak bayrak kurma işlemi aşağıdaki gibi yazılabilir.
a | (1 << b)
a Biti olarak ayarlanacak sayı nerede 1. Ve b ayarlanacak bitin konumudur. Sola kaydırma işlecini kullanmak burada çok uygundur, çünkü hangi bit ile çalıştığımızı hemen anlayabilirsiniz.
Bayrak sıfırlama
Diğer bitleri bozmadan belirli bir biti sıfırlamak (yani olarak ayarlamak) için , bitini sıfırlamak istediğiniz sayı (yani olarak ayarlamak) ile özel olarak oluşturulmuş bir sayı arasında 0bir işlem gerçekleştirmeniz gerekir ; burada tüm bitler eşittir . sıfırlamak istediğiniz bit için.&01
Örneğin, sayıya sahip olduğunuzu 0b00001010ve 4. biti olarak ayarlamanız gerektiğini varsayalım 0. Bu durumda şunları yapmanız gerekir:
0b00001010 & 0b11110111 = 0b00000010
4. bit zaten sıfıra ayarlanmış olsaydı, o zaman hiçbir şey değişmezdi.
Genel olarak bir bayrağı sıfırlama işlemi aşağıdaki gibi yazılabilir.
a & ~(1 << b)
a Biti sıfırlanacak olan sayı nerede 0. Ve b silinecek bitin pozisyonudur.
1Sıfır olmasını istediğimiz dışındaki tüm bitlerin olduğu bir sayı elde etmek için önce 1 b konumu sola kaydırırız ve ardından NOTsonucu ters çevirmek için bitsel operatörü kullanırız.
Bir bayrağı kontrol etme
Belirli bir bayrağı ayarlamaya veya sıfırlamaya ek olarak, bazen belirli bir bayrağın ayarlanıp ayarlanmadığını, yani belirli bir bitin eşit olup olmadığını kontrol etmeniz yeterlidir 1. Bunu bitwise ile yapmak oldukça kolaydır &.
1Örneğin, sayı içinde 4. bitin ayarlanıp ayarlanmadığını kontrol etmeniz gerektiğini varsayalım 0b00001010. O zaman bunu yapmanız gerekir:
if ( (0b00001010 & 0b00001000) == 0b00001000 )
Genel olarak bir bayrağı kontrol etme işlemi aşağıdaki gibi yazılabilir.
(a & (1 << b)) == (1 << b)
a Biti kontrol edilen sayı nerede . Ve b kontrol edilecek bitin konumudur.
4. Şifreleme
Bitsel XORişlem genellikle programcılar tarafından basit şifreleme için kullanılır. Genel olarak, bu tür bir şifreleme şöyle görünür:
result = number ^ password;
number Şifrelemek istediğimiz veri nerede, veri password için "şifre" olarak kullanılan özel bir numara ve result şifrelenmiş numaradır.
number == (number ^ password) ^ password;
Burada önemli olan operatör XORbir numaraya iki kez uygulandığında "şifre" ne olursa olsun orijinal numarayı üretmesidir.
number durumundan kurtarmak için encrypted resultişlemi tekrar gerçekleştirmeniz yeterlidir:
original number = result ^ password;
Örnek:
class Solution
{
public static int[] encrypt(int[] data, int password)
{
int[] result = new int[data.length];
for (int i = 0; i < data.length; i++)
result[i] = data[i] ^ password;
return result;
}
public static void main(String[] args)
{
int[] data = {1, 3, 5, 7, 9, 11};
int password = 199;
// Encrypt the array of data
int[] encrypted = encrypt(data, password);
System.out.println(Arrays.toString(encrypted));
// Decrypt the array of data
int[] decrypted = encrypt(encrypted, password);
System.out.println(Arrays.toString(decrypted));
}
}
GO TO FULL VERSION