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ç
0b00000011 << 1
0b00000110
0b00000011 << 2
0b00001100
0b00000011 << 5
0b01100000
0b00000011 << 20
0b001100000000000000000000

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ç
0b11000011 >> 1
0b01100001
0b11000011 >> 2
0b00110000
0b11000011 >> 5
0b00000110
0b11000011 >> 20
0b00000000

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 !

Önemli!

İş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));
   }
}