"Merhaba, Amigo!"

"Ayrıca bit maskeleri ve XOR hakkında konuşmak istiyorum."

"Sayıların bitlerden oluştuğunu zaten biliyorsunuz ve bu bitler üzerinde çeşitli işlemler gerçekleştirebilirsiniz. Bir bit maskesi, birkaç farklı mantıksal değerin (doğru/yanlış değerleri) tek bir tamsayı olarak temsilidir. Bu durumda, her bir boole değeri şuna karşılık gelir: belirli bir bit. İşte bunun nasıl yapılabileceği:"

"İkinin (1, 2, 4, 8, 16, 32, ...) kuvvetlerinin ikili temsili yalnızca bir bitin ayarlanmasını içerir:"

Sayı ikili temsil
1 0000 0001
2 0000 0010
4 0000 0100
8 0000 1000
16 0001 0000
19 (ikinin kuvveti değil) 0001 0011
31 (ikinin kuvveti değil) 0001 1111

"Yani, herhangi bir tamsayı, bir bit dizisi veya bir boole değerleri dizisi olarak ele alınabilir."

"Farklı boole değerlerini tek bir sayıda şu şekilde saklayabilirsiniz:"

Boole değerleri
boolean a = true;
boolean b = false;
boolean c = true;
boolean d = false;
Tek bir sayıya sığdırılmış değerler:
int result = 0;
 if (a) result += 1; // 1 == 20 — bit 0
 if (b) result += 2; // 2 == 21 — bit 1
 if (c) result += 4; // 4 == 22 — bit 2
 if (d) result += 8; // 8 == 23 — bit 3

"Karşılık gelen boole değişkeni doğruysa, şimdi her bit 1'dir."

Bizim durumumuzda, a ve c değişkenleri doğruydu, dolayısıyla sonuç 1+4 == 5'e eşittir

0000 0101
0000 dcba

"Sanırım ne olduğunu biliyorum."

"Anladıysan devam edelim."

"Bir int 32 bit içerir. Bunlardan biri sayının işareti için kullanılır ve diğer 31, 31 boole değişkeninin değerlerini depolamak için kullanılabilir."

"Bir uzun, 63 boolean değişkeni saklayabileceğimiz 64 bit içerir."

"Evet."

"Tek bir sayıya sıkıştırılmış düzinelerce değişken. Bu oldukça az."

"Ama bu nerede uygulanıyor?"

"Esas olarak, nesneler hakkında çok fazla bilgi depolamanız gereken durumlarda. Bir nesne hakkında çok fazla bilgi sakladığınızda, her zaman birkaç düzine boole değişkeni vardır. "Bu yaklaşımla, bunların tümü uygun bir şekilde tek bir numarada depolanıyor. ."

"'Kayıtlı' kelimesine vurgu yaparak. Çünkü aslında numarayı kullanmak pek uygun değil."

"Bu arada, benim de sormak istediğim buydu. Sayıdan boole değerini nasıl çıkaracağız?"

"Hiç de karmaşık değil. Diyelim ki bit 6'nın 1'e ayarlanıp ayarlanmadığını belirlemeniz gerekiyor (2 üzeri beş, 32'dir). Şu şekilde kontrol edebiliriz:"

Sayıları bir araya getirin:
int a = 32; // 25 == 0010 0000
int b = 8; // 23 == 0000 1000
int c = 2; // 21 == 0000 0010

int result = a + b + c; // 32 + 8 + 2 == 42 == 0010 1010
Belirli bitleri kontrol ederek değerleri çıkarın:
int a = result & 32; // 0010 1010 & 0010 0000 = 0010 0000
int b = result & 8; // 0010 1010 & 0000 1000 = 0000 1000
int c = result & 2; // 0010 1010 & 0000 0010 = 0000 0010

"Dolayısıyla, bit maskeleriyle çalışmak üç işlem içerir:"

1)  Belirli bir biti 0 olarak ayarlayın

2)  Belirli bir biti 1 olarak ayarlayın

3)  Belirli bir bitin değerini kontrol edin.

"Örneğin, bit 6'yı ele alalım."

"Bit 6'yı 1'e nasıl ayarlarsınız?"

kod Tanım
result = result | 01000000;
result |= 01000000;
Bit 6'yı 1'e nasıl ayarlarsınız?
result = result & 10111111;
result &= 10111111;
Bit 6'yı 0'a nasıl ayarlarsınız?
c = result & 01000000;
Bit 6'nın değerini nasıl elde edersiniz?

"Bu oldukça sıra dışı, ama zor değil. Dostum, artık başarılı bir programcıyım."

"Ve belirli bir biti 0 veya 1: 01000000 veya 10111111 olarak ayarlanmış sayıların kolayca nasıl alınacağına dair bir küçük ipucu daha."

Bunun için >> ve  << operatörlerimiz var  .

"1, 2'nin sıfırıncı kuvvetidir. Diğer bir deyişle, biti 0 olan bir sayı, 1'e ayarlanmış. Biti 6 olan bir sayıya ihtiyacımız var."

int c = 1 << 6; // 0000 0001 << 6 == 0100 0000 == 64

"Harika! Bu tür durumlar için gerçekten çok yardımcı oluyor."

"Ama ya belirli bir bitin 0'a ayarlanması dışında her bitin 1'e ayarlandığı bir sayıya ihtiyacım olursa?"

"Bu da zor değil:"

int d = ~(1 << 6); // ~0100 0000 == 10111111

"Başka bir deyişle, her şey çok basit:"

kod Tanım
result = result | (1 << 6);
result |= (1 << 6);
Bit 6'yı 1'e nasıl ayarlarsınız?
result = result & ~(1 << 6);
result &= ~(1 << 6);
Bit 6'yı 0'a nasıl ayarlarsınız?
c = result & (1 << 6);
Bit 6'nın değerini nasıl elde edersiniz?

"Çok zor görünmüyor. Ama hemen hatırlamayacağım."

"Ancak, başka birinin kodunda "result &= ~(1 << 6)" gibi korkutucu bir ifadeyle karşılaşırsanız, bu kişinin sadece bir bit maskesiyle çalıştığını anlarsınız."

"Ve onunla sık sık karşılaşırsanız, o zaman sizin için kendini hatırlayacaktır."

"Kendini hatırla... Kulağa hoş geliyor. Ders için teşekkürler."