Önceki Yazı: C ve C++’ta Bit Düzeyinde İşlemler – 1: Bit Kaydırma Operatörleri
Bit maskeleme tıpkı serinin birinci yazısında bahsettiğimiz bit kaydırma işlemleri gibi bit düzeyinde yapılan işlemlerdir. Bu metot veriye en temel ve saf haliyle yani 1’ler ve 0’lar olarak yaklaştığımız metottur. Bit maskeleme ile veri üzerinde bit düzeyinde hakimiyet sağlarız. Yüksek performans gerektiren işlerde, gömülü sistemlerde, görüntü işlemede, optimizasyon problemlerinde ve bilgi işlemin diğer birçok alanında bit maskeleme kullanılır. Uygulama alanı geniş olduğundan biz bu yazıda sadece gömülü sistemler için yazılım geliştirirken nasıl kullanacağımıza odaklanacağız.
Bit maskeleme, verileri char/int/float olarak işlemek yerine, bit olarak işleme yöntemidir. Belirli türdeki verileri kompakt ve verimli bir şekilde depolamak ve işlemek için inanılmaz derecede faydalıdır. Bir bit, 0 veya 1 olabilen bir ikili değeridir. Hesaplama yaparken, bir sayı kullandığımızda, bunlar 0’lar ve 1’lerin toplamı olarak işlenir. Örneğin, 5 sayısı ikili sistemde 101 bit dizisi olarak temsil edilir. Maskeleme, bu bit dizisindeki bitlerin bir kısmını tuttuğumuz, değiştirdiğimiz veya kaldırdığımız genel bir kavramdır.
Bit maskeleme fikri, boole mantığına dayanmaktadır. Boole mantığını bilmeyenler için,kısaca 1 ve 0 değerlerinin mantıksal işlemler yoluyla işlenmesidir. Literatürde 1
için doğru, true, high, set
gibi adlar kullanılırken 0
için yanlış, false, low, reset
gibi adlar kullanılır.
Bit maskeleme işlemi için NOT, AND, OR, XOR
mantıksal işlemleri kullanılır:
NOT a | Sonuç, giriş değerinin tersidir. Giriş değeri 1 ise sonuç 0, 0 ise sonuç 1’dir. |
a AND b | Her iki giriş değeri de 1 ise, sonuç 1’dir, aksi takdirde 0’dır. |
a OR b | Giriş değerlerinden biri 1 ise, sonuç 1’dir, aksi takdirde 0’dır. |
a XOR b | Girş değerleri birbirinden farklı ise, sonuç 1, aynı ise sonuç 0’dır. |
Bilgi işlem dünyasında bu 1/0 değerlerinin her bir biri bir bit olarak adlandırılır. C’deki temel veri türleri bu bitlerin 8’li katları sayısında bitlerle temsil edilir. Örneğin (mimariye göre değişmekle birlikte) genelde char veri türü 8 bitten, int veri türü 16 bitten, long veri türü ise 32 bitten oluşur. 8 bitlik veri bir bayt (byte) olarak adlandırılır.
Aşağıda bit maskeleme işlemleriyle bit düzeyinde yapılabilen işlemler başlıklar halinde listelenmiştir.
n’nci Bitin Değerini 1 Yapma
Bir değikenin n’nci bitinin değerini 1 yapmak için bu değişken 2^n
ile OR
mantıksal işlemine tabi tutulur. Örneğin 0x42 (0b01000010)
değerinin 3. bitini 1 yapalım.
int n = 3; int degisken = 0b01000010; degisken |= 1 << n; // 01000010 OR 00001000 == 01001010
n’nci Bitin Değerini 0 Yapma
Bir değişkenin n’nci bitinin değerini 0 yapmak için bu değişken, 2^n’in mantıksal tersi (NOT) ile mantıksal AND işlemine tabi tutulur. Örneğin 0x4A (0b01001010) değerinin 3. bitini 0 yapalım.
int n = 3; int degisken = 0b01001010; degisken &= ~(1 << n); // 01001010 AND 11110111 == 01000010
n’nci Bitin Değerini Ters Çevirme
Bir değişkenin n’nci bitinin değerini ters çevirmek (1 ise 0, 0 ise 1) için bu değişken, 2^n ile XOR işlemine tabi tutulur. Toggle işlemlerinde kullanılır.
int n = 3; int degisken = 0b01000010; degisken ^= 1 << n; // 01000010 XOR 00001000 == 01001010 // 01001010 XOR 00001000 == 01000010
n’nci Bitin Değerini Alma
Bir değişkenin n’nci bitinin değerini almak için bu değişken 2^n
değeri ile AND
işlemine tabi tutulur.
int n = 3; int degisken = 0b01001010; int bit = degisken & 1 << n; // 01000010 AND 00001000 == 00000000 // 01001010 AND 00001000 == 00001000
İlk Yorumu Siz Yapın