Bit Maskeleme Nedir?


191

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.


1
& | Gibi bitsel operatörleri anlıyor musunuz? ^ vb ve genel olarak Boole mantığı? Maske işlemlerinin herhangi bir açıklaması bunu gerektirir.
Paul R

1
Evet, bitsel operatörleri ve mantıksal mantığı
anladım

2
Bağlantıların yayınlanmaması gerektiğini biliyorum, ancak wikipedia açıklaması harika: en.wikipedia.org/wiki/Mask_(computing)
pevik

2
@pevik bağlantı göndermek için ok ama bazı açıklama ile bağlantı bir gün ölürse, yazı hala cevaplama amacına hizmet edebilmek için. Ayrıca bağlantı yalnızca tanıtım amaçlı olmamalıdır.
Dexter

Yanıtlar:


245

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:

  • Değerdeki bitlerin bir alt kümesini çıkarmak için Bitwise ANDing
  • Değerdeki bitlerin bir alt kümesini ayarlamak için Bitwise ORing
  • Değerdeki bitlerin bir alt kümesini değiştirmek için Bitsel XORing

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;

5
İyi cevap ama maskeleme, OR veya XOR işlemleri ve uygun bir maske ile belirli bitleri ayarlamak veya değiştirmek için de uygulanabilir .
Paul R

@ user239558 örnek ve doğru sözdizimi için teşekkürler. @ Paul R. user239558 tarafından sağlanan örnekte maske VE değer söyleyebilir miyim
Mr.Z

@ Mr.Z: C, C ++ ve ilgili dillerde bitwise AND operatörü olarak yazılır &.
Paul R

@ Mr.Z Örneğin: uzak içeriği maskeleme ile uint32_t açık bir bayt #define MASK 0x000000FF .... my_uint32_t &= ~MASK.
Lundin

bbelirtmek için ikili değişmezi doğru, bütün derleyici tarafından desteklenmiyor?
Ungeheuer

76

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-

resim açıklamasını buraya girin

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 1bu 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 ( 1oldu 0, 0oldu 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 1o zaman tuhaftır; çünkü 0eş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]

1
Ayrıca, bir tamsayıyı tek bir no'ya dönüştürmek için. eğer çift bir sayı ise: i = i | 1. 1, 3, 5, ..., 2, 4, 6, ... gibi bir dizi oluşturmaya çalışırken bu
işe yarar

Bir tamsayıdan yalnızca en az anlamlı biti olan sayıyı bulmak için aşağıdaki işlemi de kullanabilirsiniz: lsb = i & -i
Harshit Sharma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.