Bitwise İşlemleri

Bit Operatörleri

Bit düzeyinde işlem yapan operatörlerdir; yani sayıları bir bütün olarak değil, bit bit ele alarak işleme sokarlar. Bit operatörlerinin aldığı operandların tamsayı türlerinden olması gerekir (char,short,int,long),float yada double türleri bu operatörlerle işleme sokulamaz.Bit operatörlerinin listesi,”kendi aralarındaki öncelik sırası gözönüne alınarak” aşağıda verilmiştir:

~ Bit Değil(bitwise not)
<<  >> Sola ve sağa öteleme(bitwise left,bitwise right shift)
& Bit Ve (bitwise and)
^ Bit Özel Veya(bitwise exor)
| Bit Veya(bitwise or)

Bit Değil (bitwise not) operatörü (~) tek operandlıdır ve yalnızca önek durumundadır.Bunun dışındaki tüm bit operatörleri iki operand almaktadır.Bit operatörleri uygulamalarda genellikle “sayıların bit durumlarını öğrenmek” veya “diğer bitlere dokunmadan çeşitli bitlerin değerlerini değiştirmek” amacıyla kullanılır.

Bit Değil (~) Operatörü

Tek operand alan ve her zaman önek durumunda olan bu operatör, 1’e tümleme işlemi yapar.Yani operandı olan sayıdaki 1 olan bitleri 0, 0 olan bitleri de 1’e dönüştürür.

Örneğin:

unsigned int x=0x1834;/*16 bitlik sayi gösterimi*/

unsigned int y;

y=~x;

/*y =?*/

Önce x içerisindeki sayıyı bit bit ifade edelim:

      x sayısının bitlerle ifade edilişi

0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0

 1’leri 0; 0’ları 1 yaparsak;

      x sayısının 1’e tümleyeni (~x)

1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 1

      2 Bitin Hex(16’lık) Yazımı

E 7 C B

 

 

 

Bit Ve (&) Operatörü

Karışılıklı bitleri Ve işlemine tabi tutarız.Ve işleminin doğruluk tablosunu hatırlayalım.

 

a b  a & b
0 0 0
0 1 0
1 0 0
1 1 1

Pratik olarak; a ve b değerlerinden biri “0” iken sonuç ” 0’dır “şeklinde anımsayabilirsiniz. x = 0xB8; /Hex karşılıklar/

y =0x1C;

z =x & y ; /*z=? /

x ve y değişkenlerinin bit durumlarını inceleyelim.

x = 1 0 1 1   1 0 0 0

y = 0 0 0 1  1 1 0 0

 

Karşılıklı bitler üzerinde Ve işlemi yapılırsa:

x=1001 1000

y=0001 1100

x&y=0001 1000

 

Bit Veya(|) Operatörü

Karşılıklı bitler üzerinde Veya işlemi uygulanır.Veya işleminin doğruluk tablosunu hatırlayalım.

a b  a | b
0 0 0
0 1 1
1 0 1
1 1 1

 

Pratik olarak veya işleminde girişlerden biri “1” ise çıkış “1” dir.

x=0x1FC0;

y=0x153A;

 

x=0001 1111 1100 0000
y=0001 0101 0011 1010

 

Karşılıklı bitler Veya işlemine tabi tutulursa:

x=0001 1111 1100 0000

y=0001 0101 0011 1010

x|y =0001 1111 1111 1010

 

Bir sayının “diğer bitlerine dokunmadan bazı bitlerinin istenilen değerlerle değiştirilmesi”;

Bit operatörlerinin en önemli uygulama alanıdır.Örneğin , a bir tamsayı olsun 3 ve 4 numaralı bitleri sırasıyla 1,0 ile değiştirmek isteyelim.

Böyle bir işlemi 2 adımda gerçekleştirebiliriz.

  1. Adım a’nın içerisindeki sayıyı Önce diğer bitlere dokunmadan yalnızca 3 ve 4 numaralı bitleri 0 yaparız.Bunun için a değişkenini uygun bir sayıyla Bit Ve işlemine tabi tutmak gerekir.

                                                                                       A Sayısı 

F E D C B A 9 8 7 6 5 4 3 2 1 0
x x x x x x x x x x x x x x x x

 &

0xFFE7 Sayısı 

F E D C B A 9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1

                

=a & 0xFFE7 

F E D C B A 9 8 7 6 5 4 3 2 1 0
x x x x x x x x x x x 0 0 x x x

 

a değişkenini 0xFFE7 ile Bit Ve işlemine tabi tuttuğumuzda , 3. Ve 4.bitler 0 olur(ve işleminde giriş bitlerindenden birinin 0 olması çıkış bitini 0 yapardı),fakat diğer bitler değerlerini değiştirmez.

  1. Adım:Elde ettiğimiz sayıyı,3 ve 4 numaralı bitleri istediğimiz gibi değiştirebilicek bir sayı ile bu kez Bit Veya işlemine sokmamız

 

F E D C B A 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0

 

Bu iki adımı aynı ifade içerisinde yazarsak;

A=a&0xFFE7 | 0x0008;

 

ASCII karakter tablosunu dikkatle inceleyin;büyük harflerden sonra hemen küçük harflerin gelmediğini göreceksiniz.

Karakter Hex(desimal) İkilik Sistem
A 41(65) 0100 0001
B 42(66) 0100 0010
C 43(67) 0100 0011
Z 5A(90) 0101 1010
[ 5B(91) 0101 1011
\ 5C(92) 0101 1100
a 61(97) 0110 0001
b 62(98) 0110 0010
c 63(99) 0110 0011

 

‘a’-‘A’ =32 olması bir rastlantı değil,tasarımcının bir özelliğidir.Büyük ve küçük harfler arasında yalnızca 6 numaralı bit farklıdır.Küçük harf yada büyük harf olduğunu bildiğimiz karakterlerin 6.bitini değiştirirsek, büyük harfi küçük harfe,küçük harfi de büyük harfe dönüştürmüş oluruz.

a=’A’;

ch=a+32;   /*ch=’a’*/ ifadesi ile

a=’A’;

ch = a| 32; /*ch=’a’ */

 

ifadesi aynı anlama gelir.

Bit Özel Veya (^) Operatörü

 

Bu operatör de iki operand alır.Operandları aynı ise 0,farklı ise 1 değerini üretir.Doğruluk tablosunu hatırlayalım.

 

a b  Özel Veya a^b
0 0 0
0 1 1
1 0 1
1 1 0

 

Özel veya işlemi farklı olan bitleri belirlemek için kullanılabilir.

a=0x15C4;

b=0x12C5;

 

a bilgisi değişerek b biçimine dönüşmüş olsun; a’nın acaba hangi bitleri değişmiştir?

a      =  0001 0101 1100 0100

b     =  0001 0010 1100 0101

a^b = 0000 0111 0000 0001

Özel veyada aynı girişler 0,farklı girişler 1 sonucunu veriyordu buna göre a^b sonucunda 1’lerin

bulunduğu yerler değişken bitleri gösterir.

Bitwise İşlemleri

unsigned int c; /*İşaretsiz Sayı ataması */

bu atamada c değişkeni negatif olamaz.Çünkü unsigned 0 ve pozitif sayıları kapsar.

char 1 byte 8 bit değişken tanımlaması.’a’ bir biti temsil ettiğini düşünelim.

 

a₇ a₆ a₅ a₄ a₃ a₂ a₁ a₀

 

İşaretli ise bu bit Sayının Pozitif yada Negatif Olduğunu Belirler.1 ise negatif,0 ise pozitiftir .

2’lik Sistemde İşaretli Sayılar

(a₇a₆a₅a₄a₃a₂a₁a₀)₂=( a₇.-2⁷)+( a₆.2⁶)+( a₅.2⁵)+( a₄.2⁴)+( a₃.2³)+( a₂.2²)+( a₁.2¹)+( a₀.2º)

 

(1011 1011) ₂=-69(işaretli ise)(signed)En sondaki En yüksek değerli bit sadece işareti belirtmek için.

(1011 1011) ₂=197(işaretsiz ise)(unsigned)

Right Shift(Sağa Kaydırma Operatörü)

Bitleri kaydıralacak sayi>>kaç defa kaydırılacağı

Bir kez Sağa kaydırma 2’lik sistemde bölme işlemine denk gelir.

10>>1=5(1010)>>1=(0101)

8>>1=4(1000)>>1=(0100)

Peki sayı negatif olursa ne olacak?

1000 0000 sayı işaretli ve negatif , 3 kez sağa kaydıralım..

 

1 0 0 0 0 0 0 0

Bir kez sağa kaydıralım.

1 1 0 0 0 0 0 0

İkinci kez sağa kaydıralım.

1 1 1 0 0 0 0 0

Üçüncü kez sağa kaydıralım.

1 1 1 1 0 0 0 0

Pratikte yaptığımız sayı işaretli ve negatifse sağına kaydırdığımız kadar 1 ekliyoruz.

Left Shift(Sola Kaydırma)

Kaydıralacaksayi<<kaydırmamiktarı;

Örneğin: 5<<10(101)<<1(1010) Sola 1 kez kaydırdık 2 ile çarpılmış oldu.

Bitwise Operatörleri Uygulama Örneği

#include <stdio.h>
#include <Windows.h>
//İkili Sayilari Toplayan Program

int main(void)
{
unsigned int x=1,y=3,toplam,elde;

toplam=x^y;//x=0 y=0 toplam =0,x=1 y=1 toplam =0
elde=x&y;//x=1 y=1 elde =1

while (elde!=0)//elde 0 olmadığı sürece döngüyü isle.
{
elde=elde<<1;//eldeyi 1 sola kaydır.
x=toplam;
y=elde;
toplam=x^y;
elde=x&y;
}
printf(“Toplam=%d\n”,toplam);
system(“pause”);
}

Ekran Alıntısı

 

 

Yorum bırakın