Bilgisayar içerisinde tüm veriler bitler ile temsil edilir. Her bit yalnızca 0 veya 1 değerini alabilir. Çoğu sistemde 8 bit bir baytı oluşturur. Byte, char tipi için standart depolama birimidir. Diğer veri tipleri daha çok sayıda baytlar içinde saklanır. Bit operatörleri operandlarının bitlerini yönetmek için kullanılır. Bit operatörleriyle genellikle işaretsiz tamsayılar (unsigned int) kullanılır. Bit işlemleri doğası gereği makine-bağımlı olduğundan dolayı bu programlar sizin sisteminizde doğru olarak çalışmayabilir.
Bit operatörleri şunlardır: AND(&), OR( | ), EXCLUSIVE OR(^), sola kaydırma(<<), sağa kaydırma(>>) ve tümleyen(~).
AND(&): İki operandın ikisinin de ilgili bitlerinde 1 varsa sonuçtaki bitler 1 yapılır.
OR( | ): İki operandın ilgili bitlerinden en az biri 1 ise sonuçtaki bitler 1 yapılır.
EXCLUSI ve OR (^): Operandların ilgili bitlerinden yalnızca biri 1 ise sonuçtaki bitler 1 yapılır.
Sağa kaydırma(>>): İlk operandındaki bitleri ikinci operandında belirtilen sayı kadar sağa kaydırır. Soldan itibaren yapılacak doldurma işlemciye bağlıdır.
Tümleyen (~): Tüm sıfır bitleri 1, tüm 1 bitleri 0 yapar
İşaretsiz (unsigned) Tam Sayıyı Bit olarak Yazdırma
Bit operatörlerini kullanırken, değerleri ikilik sistemde yazdırmak bu operatörlerin etkilerini gösterebilmek için oldukça kullanışlıdır.
Aşağıdaki örnek, unsigned bir tam sayıyı her biri 8 bitten oluşan gruplarla ikilik gösterimde yazdırmaktadır.
#include <stdio.h>
void displayBits(unsigned int value);
int main(){
unsigned int x;
printf("%s","Enter a nonnegative int: ");
scanf("%u",&x);
displayBits(x);
}
void displayBits(unsigned int value){
unsigned int c; // sayıcı
//displayMask'ı tanımlama ve 31 biti solo kaydırma
unsigned int displayMask = 1 << 31;
printf("%10u = ",value);
for(c=1;c<=32;++c){
putchar(value & displayMask ? '1' : '0');
value <<=1; // 1 ile değeri sola kaydırma
if(c % 8 == 0) { // 8 bitten sonraki yerin çıkışı
putchar(' ');
}
}
putchar('\n');
}
Ekran Çıktısı:
Enter a nonnegative int:65000
65000 = 00000000 00000000 11111101 11101000
displayBits fonksiyonu value ve displayMask değişkenlerini birleştirmek için bit AND operatörünü kullanır. Sıklıkla bit AND operatörü maske (belirli bitleri 1 değerine ayarlanmış bir tam sayı değeri) adı verilen bir operant kullanılır. Maskeler diğer bitleri seçerken bazı bitleri değer içinde saklamak için kullanılır. displayBits fonksiyonunda maske değişkeni displayMask şu değere atanmıştır;
1 << 31 (10000000 00000000 00000000 00000000)
Sola kaydırma operatörü, 1 değerini displayMask içindeki en düşük değerlikli (en sağdaki) bitten en yüksek değerlikli (en soldaki) bite doğru kaydırır ve sağdan itibaren bitleri o ile doldurur.
putchar(value & displayMask ? '1' : '0');
değişkenin en solundaki bit değerinin 0 ya da 1 olarak çıkarılmasına karar verir. value ve displayMask "&" kullanılarak birleştirilirse value değişkeninde en soldaki bit dışındaki bitler saklanır çünkü 0 ile biten bitler birbirine geçiş sağlar. Eğer en soldaki bit 1 ise value ve displayMask gerçek bir değer alır ve 1 ekrana yazılır aksi durumda 0 yazılır. Ardından value değişkeni bir sola kaydırılır value <<=1 ile. Atanmamış değişken value'da bu adımlar her bit için tekrarlanır .
Bitsel AND Operatörü (&)
Kullanılan iki operandın bitleri 1 ise, bitsel AND'in çıkışı 1'dir. Operandlardan herhangi biri 0 ise, bitsel AND'in çıkışı 0'dır.
12 ve 25 tamsayılarının bit düzeyinde AND işlemini inceleyelim:
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bit Operation of 12 and 25 00001100 & 00011001 ________ 00001000 = 8 (In decimal)
Örnek:
#include <stdio.h>
int main() {
int a = 12, b = 25;
printf("Output = %d", a&b);
return 0;
}
Çıktı:
Output = 8
Bitsel OR Operatörü (|)
Kullanılan operadlardan en az biri 1 ise, bitsel Or'ın çıkışı 1'dir.
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bitwise OR Operation of 12 and 25 00001100 | 00011001 ________ 00011101 = 29 (In decimal)
Örnek:
#include <stdio.h>
int main() {
int a = 12, b = 25;
printf("Output = %d", a|b);
return 0;
}
Çıktı:
Output = 29
Bitsel XOR (exclusive OR) Operatörü (^)
İki operandaki bitler zır ise, bitrsel XOR'un çıkışı 1 olur.
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bitwise XOR Operation of 12 and 25 00001100 ^ 00011001 ________ 00010101 = 21 (In decimal)
Örnek:
#include <stdio.h>
int main() {
int a = 12, b = 25;
printf("Output = %d", a^b);
return 0;
}
Çıktı:
Output = 21
Shift Operatörleri
C'de iki tane shift operatörü vardır: Right shift ve left shift
Rigth Shift Operatörü(>>)
Sağa kaydırma operatörü, tüm bitleri belirli sayıda belirtilen bit kadar sağa kaydırır.
212 = 11010100 (In binary) 212>>2 = 00110101 (In binary) [Right shift by two bits] 212>>7 = 00000001 (In binary) 212>>8 = 00000000 212>>0 = 11010100 (No Shift)
Left Shift Opetatörü(<<)
Sola kaydırma operatörü, tüm bitleri belirli sayıda belirtilen bit kadar sola kaydırır. Sola kaydırma operatörü tarafından boşaltılan bit konumları 0 ile doldurulur.
212 = 11010100 (In binary) 212<<1 = 110101000 (In binary) [Left shift by one bit] 212<<0 = 11010100 (Shift by 0) 212<<4 = 110101000000 (In binary) =3392(In decimal)
Örnek
#include <stdio.h>
int main() {
int num=212, i;
for (i=0; i<=2; ++i) {
printf("Right shift by %d: %d\n", i, num>>I);
}
printf("\n");
for (i=0; i<=2; ++i) {
printf("Left shift by %d: %d\n", i, num<<i);
}
return 0;
}
Çıktı:
Right Shift by 0: 212 Right Shift by 1: 106 Right Shift by 2: 53 Left Shift by 0: 212 Left Shift by 1: 424 Left Shift by 2: 848
C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:
Kaynaklar:
https://www.bilgigunlugum.net/prog/cprog/2c_veri
https://www.programmingsimplified.com/c/source-code/c-program-convert-decimal-to-binary
https://www.programiz.com/c-programming/bitwise-operators
https://www.javatpoint.com/bitwise-operator-in-c
Deitel Deitel C/C++