C programlamasında oldukça yeniyim ve biraz maskeleme ile karşılaştım. Birisi bana bit maskelemesinin genel kavramını ve işlevini açıklayabilir mi? Örnekler çok takdir edilmektedir.
C programlamasında oldukça yeniyim ve biraz maskeleme ile karşılaştım. Birisi bana bit maskelemesinin genel kavramını ve işlevini açıklayabilir mi? Örnekler çok takdir edilmektedir.
Yanıtlar:
Bir maske hangi bitleri saklamak istediğinizi ve hangi bitleri temizlemek istediğinizi tanımlar.
Maskeleme, bir değere maske uygulama eylemidir. Bu, aşağıdakileri yaparak gerçekleştirilir:
Aşağıda, değerdeki bitlerin bir alt kümesini çıkarma örneği verilmiştir:
Mask: 00001111b
Value: 01010101b
Maskeyi değere uygulamak, ilk (yüksek) 4 biti temizlemek ve son (alt) 4 biti tutmak istediğimiz anlamına gelir. Böylece düşük 4 biti çıkardık. Sonuç:
Mask: 00001111b
Value: 01010101b
Result: 00000101b
Maskeleme AND kullanılarak gerçekleştirilir, bu nedenle C'de:
uint8_t stuff(...) {
uint8_t mask = 0x0f; // 00001111b
uint8_t value = 0x55; // 01010101b
return mask & value;
}
Oldukça yaygın bir kullanım örneği: Daha büyük bir kelimeden tek tek baytların çıkarılması. Kelimedeki yüksek dereceli bitleri ilk bayt olarak tanımlıyoruz. Bunun için iki operatör kullanıyoruz &
ve >>
(sağa kaydır). 32 bit tam sayıdan dört baytı şu şekilde çıkarabiliriz:
void more_stuff(uint32_t value) { // Example value: 0x01020304
uint32_t byte1 = (value >> 24); // 0x01020304 >> 24 is 0x01 so
// no masking is necessary
uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so
// we must mask to get 0x02
uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so
// we must mask to get 0x03
uint32_t byte4 = value & 0xff; // here we only mask, no shifting
// is necessary
...
}
Yukarıdaki operatörlerin sırasını değiştirebileceğinize dikkat edin, önce maskeyi, sonra vardiyayı yapabilirsiniz. Sonuçlar aynı, ancak şimdi farklı bir maske kullanmanız gerekecek:
uint32_t byte3 = (value & 0xff00) >> 8;
&
.
#define MASK 0x000000FF .... my_uint32_t &= ~MASK
.
b
belirtmek için ikili değişmezi doğru, bütün derleyici tarafından desteklenmiyor?
Maskeleme , bilgilerin istenen bir kısmını tutmak / değiştirmek / kaldırmak anlamına gelir. Bir görüntü maskeleme işlemi görelim; mesela- bu maskeleme işlemi cilt olmayan herhangi bir şeyi kaldırıyor-
Bu örnekte VE işlemini yapıyoruz . Başka maskeleme operatörleri de vardır - VEYA , XOR .
Bit-Maskeleme , maskeyi bitlerin üzerine koymak anlamına gelir. İşte AND ile biraz maskeleme -
1 1 1 0 1 1 0 1 [input] (&) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 0 0 1 0 1 1 0 0 [output]
Yani, sadece orta 4 bit (bu bitler 1
bu maskede olduğu gibi) kalır.
Bunu XOR ile görelim -
1 1 1 0 1 1 0 1 [input] (^) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 1 1 0 1 0 0 0 1 [output]
Şimdi, ortadaki 4 bit çevrildi ( 1
oldu 0
, 0
oldu 1
).
Böylece bit maskesi kullanarak ayrı bitlere erişebiliriz [ örnekler ]. Bazen, bu teknik performansı arttırmak için de kullanılabilir. Bunu ele alalım örneğin-
bool isOdd(int i) {
return i%2;
}
Bu işlev, bir tamsayının tek / çift olup olmadığını söyler. Bit maskesini kullanarak aynı sonucu daha fazla verimlilikle elde edebiliriz.
bool isOdd(int i) {
return i&1;
}
Kısa Açıklama : İkili sayının en az anlamlı biti ise 1
o zaman tuhaftır; çünkü 0
eşit olacak. AND ile birlikte yaparak 1
, en az anlamlı bit dışında diğer tüm bitleri kaldırıyoruz yani:
55 -> 0 0 1 1 0 1 1 1 [input] (&) 1 -> 0 0 0 0 0 0 0 1 [mask] --------------------------------------- 1 <- 0 0 0 0 0 0 0 1 [output]