Bit işlemleri, işleme katılan ifadelerin depoladığı bitler arasında uygulanır. C'deki bit işlemleri ve, veya, değili, dışlamalı veya ve kaydırmadır. Bunların gösterimi şu şekildedir:
ve: &
veya: |
değili: ~
dışlamalı veya: ^
sola kaydırma: <<
sağa kaydırma: >>
ve, veya ve değili işlemlerinin ne olduğunu mantıksal işlemlerde anlatmıştık. Bu nedenle direkt dışlamalı veya ve kaydırma işlemlerini anlatıp örneklere geçeceğiz.
dışlamalı veya işleminde eğer işleme katılan iki ifade aynı doğruluk değerine sahipse işlemin çıktısı yanlıştır (0), aksi durumda işlemin çıktısı doğrudur (1).
Kaydırma işleminde ise bütün bitler istenen değer kadar sağa veya sola kaydırılır. Kaybolan değerlerin yerine ise 0 konur. Bunun istisnası kaydırma yapılan verinin signed ve değerinin de negatif olmasıdır. Bu durumda sağa kaydırma yapılırsa baştaki kaybolan bitlerin yerine 0 değil işareti korumak için 1 konur.
Şimdi bu işlemleri örneklerle yapalım.
#include <stdio.h>
int main(void){
char a='A';
char b=126;
char c=a&b;
printf("%d",c);
return 0;
}
Bu işlemde 'A' ile 126 değerleri arasında & işlemi gerçekleştirilmiştir. 'A' karakterinin karşılığı 65'tir ve 65 ile 126 sayıları bellekte sırayla şu şekilde depolanır:
01000001
01111110
Bu iki sayı arasında karşılıklı her bit için mantıktaki ve işlemi yapılırsa sonuç 01000000 olacaktır. Bunun karşılığı da 64'tür.
Şimdi aynı iki değer için | işlemini gerçekleştirelim:
#include <stdio.h>
int main(void){
char a='A';
char b=126;
char c=a|b;
printf("%d",c);
return 0;
}
Sayılar yine aynıdır:
01000001
01111110
Bu iki sayı arasında karşılıklı her bit için mantıktaki veya işlemi yapılırsa sonuç 01111111 olacaktır ve bu da 127 demektir.
Aynı değerler için ^ işlemini gerçekleştirelim:
#include <stdio.h>
int main(void){
char a='A';
char b=126;
char c=a^b;
printf("%d",c);
return 0;
}
Yine aynı sayılar arasında karşılıklı her bit için mantıktaki dışlamalı veya işlemi yapılırsa sonuç 00111111 olur. Bu da 63 demektir.
Sadece 'A' için ~ işlemini kullanalım:
#include <stdio.h>
int main(void){
char a='A';
a=~a;
printf("%d",a);
return 0;
}
'A' yı temsil eden bitlerin tamamı (01000001) tersine dönecektir: 10111110. Bu değerin signed char olarak karşılığı da -66'dır.
Son olarak kaydırma işlemleri yapalım ve örnekteki adımları açıklayarak bu konuyu da noktalayalım.
Sağa ve sola kaydırma işlemleri şu formatta yapılır:
Sola kaydırma: İfade << Kaydırılacak bit miktarı
Sağa kaydırma: İfade >> Kaydırılacak bit miktarı
Hemen örneğimizi koyalım:
#include <stdio.h>
int main(void){
char a=15<<3;
printf("%d\n",a);
a=a>>1;
printf("%d\n",a);
a=a<<3;
printf("%d\n",a);
a=a>>5;
printf("%d\n",a);
return 0;
}
Bu kodun çıktısı şudur:
120
60
-32
-1
Programın çalışmasını inceleyelim:
İlk başta a'ya 15'in 3 bit sola kaydırılmış hali atanmıştır. 15'in ikili sistemdeki hali 00001111'dir. Burada 3 bit sola kaydırma yapacak olursak yeni değerimiz 01110000 olur. İkili sistemdeki bu sayının değeri de 120'dir. a'nın değeri yazdırıldığında karşımıza bu sayı çıkar.
Daha sonra a'nın yeni değeri mevcut değerinin 1 bit sağa kaydırılmış hali olarak atanmıştır. Bu durumda yeni değerimiz 00111100'dır ki bu da 60 demektir. Bu değer de yazdırılmıştır.
Şu ana kadar bit kaydırma işlemlerinde kaybolan bitler diğer tarafta mı belirmektedir, yoksa yeni oluşan bitler kaybolan bitlerden bağımsız olarak 0'a mı eşitlenmektedir net biçimde görülememektedir. Fakat sıradaki işlem bunu ortaya koymaktadır: 00111100 değeri 3 bit sola kaydırıldığında yeni değerimiz 11100000'dır ki bu da -32 demektir. Açıkça görülmektedir ki en soldaki 1 kaybolmuş ve bundan bağımsız olarak en sağdaki yeni bit 0 değerini almıştır. Son elde ettiğimiz değer de yazdırıldıktan sonra son adıma geçilmiştir.
Son işlem de 11100000 değerinde 5 bit sağa kaydırma yapmaktır. Veri tipi signed ve değer negatif olduğundan bu sefer yeni oluşacak bitler 0 değil 1 olacaktır. Bu durumda yeni sayımız 11111111'dir ki bu da -1 demektir. Kodun çıktısında bu değer de görülmektedir.
Mantıksal ve İlişkisel İşlemler <<<<< Temel C >>>>> Diğer İşlemler