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
a
Bitleri kaydırılan sayı nerede ve sayının b
bitlerinin kaç kez a
sola 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
a
Bitleri kaydırılan sayı nerede ve sayının bitlerinin sağa b
kaydı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, 0
en soldaki bit ise sola a 0
, 1
en 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 int
ve aslında . Yani en soldaki bit sıfırdır.0b11111111
0b00000000000000000000000011111111
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 . a
Bu 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 long
bir 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 0b00001010
ve 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 0
bir işlem gerçekleştirmeniz gerekir ; burada tüm bitler eşittir . sıfırlamak istediğiniz bit için.&
0
1
Örneğin, sayıya sahip olduğunuzu 0b00001010
ve 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.
1
Sı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 NOT
sonucu 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 XOR
iş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 XOR
bir numaraya iki kez uygulandığında "şifre" ne olursa olsun orijinal numarayı üretmesidir.
number
durumundan kurtarmak için encrypted result
iş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