Kimse bunların neden yararlı olduğu konusunu açmadığına göre:
Bayraklarla çalışırken bitsel işlemleri çok kullanıyorum. Örneğin, bir işleme bir dizi bayrak geçirmek istiyorsanız (örneğin, File.Open()
Okuma modu ve Yazma modu etkinken), bunları tek bir değer olarak iletebilirsiniz. Bu, her olası bayrağa bir bit kümesinde (bayt, kısa, int veya uzun) kendi bitini atayarak gerçekleştirilir. Örneğin:
Read: 00000001
Write: 00000010
Bu nedenle, okuma VE yazma geçmek istiyorsanız, (READ | WRITE) geçersiniz ve bu da ikisini
00000011
Daha sonra diğer tarafta şu şekilde şifresi çözülebilir:
if ((flag & Read) != 0) { //...
hangi kontroller
00000011 &
00000001
hangi döner
00000001
0 değildir, bu nedenle bayrak READ'i belirtir.
Çeşitli bitleri değiştirmek için XOR'u kullanabilirsiniz. Yönlü girişleri (Yukarı, Aşağı, Sol, Sağ) belirtmek için bir bayrak kullanırken bunu kullandım. Örneğin, bir hareketli grafik yatay olarak hareket ediyorsa ve ben onun geri dönmesini istiyorum:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Sadece mevcut değeri (LEFT | RIGHT) ile XOR, bu durumda SOL'u kapatır ve SAĞı açar.
Bit Kaydırma birkaç durumda faydalıdır.
x << y
aynıdır
x * 2 y
hızlı bir şekilde ikinin kuvveti ile çarpmanız gerekiyorsa, ancak 1 biti en üst bite kaydırmaya dikkat edin - bu, işaretsiz değilse sayıyı negatif yapar. Farklı boyutlardaki verilerle uğraşırken de kullanışlıdır. Örneğin, dört bayttan bir tamsayı okumak:
int val = (A << 24) | (B << 16) | (C << 8) | D;
A'nın en önemli bayt ve en az D olduğunu varsayarsak. Şöyle biterdi:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Renkler genellikle şu şekilde depolanır (en önemli bayt yok sayılır veya Alfa olarak kullanılır):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Değerleri tekrar bulmak için, bitleri en alta gelene kadar sağa kaydırın, ardından kalan yüksek dereceli bitleri maskeleyin:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
ile aynıdır 11111111
. Yani aslında Red için şunu yaparsınız:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)