"Enter"a basıp içeriğe geçin

C ve C++’ta Bit Düzeyinde İşlemler – 2: Bit Maskeleme

Ö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 aSonuç, giriş değerinin tersidir. Giriş değeri 1 ise sonuç 0, 0 ise sonuç 1’dir.
a AND bHer iki giriş değeri de 1 ise, sonuç 1’dir, aksi takdirde 0’dır.
a OR bGiriş değerlerinden biri 1 ise, sonuç 1’dir, aksi takdirde 0’dır.
a XOR bGirş 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

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir