Bitsel İşlemler (Bitwise)

  • 28-06-2020 05:19
  • 1297

Bilgisayarda bütün işlemler ikili sayı sisteminde yapılır. Bit kelimesi ikili sayı sistemenide bir haneye verilen isimdir. İkili sayı sisteminde her bit 0 ya da 1 olabilir. Bitsel işlemler ikili sayı sisteminde bitler üzerinde yapılan mantıksal işlemlerdir.

Bitsel işlemler birçok programlama dilinde bulunur. C programlama dilinin alt seviyeli yapısı içinde bitsel işlemler diğer aritmetik işlemlerle uyumlu bir şekilde kullanılır. Bunun anlamı C'de kullanılan temel veri tipleri üzerinde hem bitsel işlem hemde aritmetik işlemlerin yapılabilmesidir. Bitsel işlemler char,short,int,long veri tipleri ile kullanılır.

İşlemciler işlem yapılacak verileri işlemcide yazmaç (register) adı verilen sınırlı sayıda (yaklaşık 40 kadar) özel bellek hücrelerinde tutarlar. char,short,int,long veri tipindeki aritmetik ve mantıksal işlemler bu yazmaçlara kaydedilerek yapılır. Ondalıklı işlemler ise bu iş için özel bir donanım olan ve günümüzde işlemcinin bir parçası haline gelen FPU biriminde yapılır. Donanımsal nedenlerden dolayı bitsel işlemler double ve float veri tiplerinde kullanılmaz.

C programlama dilinde kullanılan bitsel işleçler

&   Ve (And)
|    Veya (Or)
  Özel veya (Xor)
~   Değil (Not)
<< Sola Kaydırma (Shift left)
>> Sağa Kaydırma (Shift right)

Ve İşleci & (AND)

İki sayının bitlerine AND mantıksal işlemi uygular. İki bitte 1 bir olduğunda sonuç 1'dir diğer bütün olasılıklarda sonuç sıfırdır.


//Ve işleci (AND)
char a=5; //00000101 char b=6; //00000110 a=a&b; //00000100

Veya İşleci | (OR)

İki sayının bitlerine OR mantıksal işlemi uygular. Yanlızca iki bitte 0 olduğunda sonuç sıfırdır diğer bütün olasılıklarda sonuç 1'dir.


//Veya işleci (OR)
char a=5; //00000101 char b=6; //00000110 a=a|b; //00000111

Özel Veya İşleci ^ (XOR)

İki sayının bitlerine XOR mantıksal işlemi uygular. İki bit bir birnden farklı ise sonuç 1'dir diğer bütün olasılıklarda sonuç 0'dır.


//Özel veya işleci (XOR)
char a=5; //00000101 char b=6; //00000110 a=a^b; //00000011

Değil İşleci ~ (NOT)

Bu işlec tek bir değişkenle kullanılır. Başına yazıldığı sayının değilini alır. Sıfırları 1, birleri 0 yapar.


//Değil işleci (NOT)
char a=5; //00000101 a=~a; //11111010

Sola Kaydırma İşleci << (Shift left)

Bir değişkenin sonuna yazılır ve sonrasında kaydırma yapılacak hane sayısı yazılır. İçeriği yazılan sayı kadar sola kaydırır. Örneğin 1 sayısını sola bir kaydırırsak sonuc iki olur. Sola kaydırılan her hanede ikilik sayı sistemi olduğu için sayı ikiye katlanır. Eğer sayının ilk hanesi 1 ise kaydırma işleminden sonra kaybolacaktır.


//Sola kaydırma işleci (Shift left)
char a=5; //00000101 a=a<<2; //00010100

Sağa Kaydırma İşleci >> (Shift right)

Bir değişkenin sağına yazılır sonrasında kaydırma yapılacak hane sayısı yazılır. İçeriği yazılan sayı kadar sağa kaydırır. 4 sayısını 1 sağa kaydırırsak sonuç 2 olur. Sağa kaydırılan her hanede ikilik sayı sistemi olduğu için sayı ikiye bölünür. Eğer son hane 1 ise kaydırma işleminden sonra kaybolacaktır.


//Sağa kaydırma işleci (Shift right)
char a=33; //00100001 a=a>>2; //00001000

 

C'de çalıştırılabilir örnek uygulama. Örnekteki sayıları değiştirip sonuçların nasıl değiştiğini görebilirsiniz.


#include <stdio.h>
int main(void){ int a,b,c; /* Her işlemdeki a ve b değerini değiştirerek sonuçların nasıl değiştiğini görebilirsiniz. */ //Ve işleci (AND) a=5; b=6; c=a&b; printf("%d&%d =%d \n",a,b,c); //Veya işleci (OR) a=5; b=6; c=a|b; printf("%d|%d =%d \n",a,b,c); //Özel veya işleci (XOR) a=5; b=6; c=a^b; printf("%d^%d =%d \n",a,b,c); //Sola kaydırma işleci (Shift left) a=1; b=2; c=a<<b; printf("%d<<%d=%d \n",a,b,c); //Sağa kaydırma işleci (Shift right) a=32; b=2; c=a>>b; printf("%d>>%d=%d \n",a,b,c); getchar(); return 0; }