Bitdüzeyi Operatörler

& ,Bitdüzeyi VE

Bit düzeyi VE (AND) operatörü C++ dilinde tek bir & sembolü ile ifade edilir. Bit düzeyi VE operatörü operandların her bit değerini şu kurala göre yönetir: eğer her iki bit değeri de 1 ise sonuç bit’i de 1 olur, diğer durumlar sonuç bit’i 0 olur.

Bunu ifade etmenin diğer yolu ise:

0  0  1  1    operand1
0  1  0  1    operand2
----------
0  0  0  1    (operand1 & operand2) – sonuç değeri

Arduino da int veri türü 16-bit uzunluğundadır. Bu nedenle iki adet int değişkeni VE operatörüyle işlemek 16 adet VE karşılaştırma işlemini aynı anda yapmaktır.

int a =  92 ;   // ikili sayı sisteminde:	0000000001011100
int b = 101;   // ikili sayı sisteminde:	0000000001100101
int c = a & b;  // sonuç:			0000000001000100     onluk sistemde 68

| ,Bitdüzeyi VEYA

Bit düzeyi VEYA (OR) operatörü C++ dilinde tek bir | sembolü ile ifade edilir. Bit düzeyi VEYA operatörü operandların her bit değerini şu kurala göre yönetir: eğer her iki bit değeri de 0 ise sonuç bit’i de 0 olur, diğer durumlar sonuç bit’i 1 olur.

Bunu ifade etmenin diğer yolu ise:

0  0  1  1    operand1
0  1  0  1    operand2
----------
0  1  1  1    (operand1 | operand2) – sonuç değeri
int a =  92 ;   // ikili sayı sisteminde:	0000000001011100
int b = 101;   // ikili sayı sisteminde:	0000000001100101
int c = a | b;  // sonuç:			0000000001111101 onluk sistemde 125

~ ,Bitdüzeyi DEĞİL

Bit düzeyi DEĞİL (NOT) operatörü C++ dilinde ~ sembolü ile ifade edilir. & ve | operatörlerinde farklı olarak DEĞİL operatörü tek bir operanda uygulanır. DEĞİL operatörü operandın her bir bit değerini tersine dönüştürür. Yani bit değeri 0 ise 1, 1 ise 0 olur.

Bunu ifade etmenin diğer yolu ise:

0  1    operand1
-----
1  0   ~operand1
int a = 103;  // ikili sayı sisteminde:	0000000001100111
int b = ~a;   // ikili sayı sisteminde:	1111111110011000 = -104

Notlar ve Uyarılar

Sonucun -104 gibi negatif bir sayı çıkmasına şaşırmış olabilirsiniz. Bunun nedeni bir tamsayı değişkendeki en yüksek değerli bit’in işaret bit’i olarak adlandırılmasıdır. En yüksek değerli bit yani en baştaki bit değeri 1 ise sayı negatif bir tamsayıdır.

Herhangi bir x tamsayısının ~x değeri, -x – 1 işleminin sonuyla aynı değerdir.

<<, Sola bit kaydırma

Sola kaydırma operatörü olan << solundaki operandın bit değerlerini sağ taraftaki operand değeri kadar sola kaydırır.

variable << number_of_bits;
variable: İzin verilen türler: byte, int, long.
number_of_bits: değeri <= 32 olan bir tamsayı
int a = 5;          // ikili sayı sisteminde:	0000000000000101
int b = a << 3; // ikili sayı sisteminde:	0000000000101000, onluk sistemde 40

Notlar ve Uyarılar

x değerinin bit’lerini y kadar sola kaydırdığınızda (x << y), en sola kayan bit’ler yok olur.

int x = 5;  // ikili sayı sisteminde: 0000000000000101
int y = 14;
int result = x << y;  // 0100000000000000 – 101’in ilk 1 değeri yok oldu

Sola kaydırma ile ilgili bilmeniz gereken bir başka konu ise sola kaydırma operatörü işlemi aslında soldaki operand ile 2 üzeri sağdaki operandın çarpımının sonucuna eşdeğer bir sonuç üretir.

     İşlem      Sonuç
   ---------    ------
    1 <<  0      1
    1 <<  1      2
    1 <<  2      4
    1 <<  3      8
    ...
    1 <<  8    256
    1 <<  9    512
    1 << 10   1024
    ...

>>, Sağa bit kaydırma

Sağa kaydırma operatörü olan >> solundaki operandın bit değerlerini sağ taraftaki operand değeri kadar sağa kaydırır.

variable >> number_of_bits;
variable: İzin verilen türler: byte, int, long
number_of_bits: değeri <= 32 olan bir tamsayı
int a = 40;     // ikili sayı sisteminde:	0000000000101000
int b = a >> 3; // ikili sayı sisteminde:	0000000000000101, onluk sistemde 5

Notlar ve Uyarılar

x değerini y kadar sağa kaydırdığınızda (x >> y), ve x’in en yüksek değerli bit olan işaret biti 1 ise yani sayı negatifse, sağa kaydırma işlemi sırasında işaret biti olan 1 kaydırılan bit’lere kopyalanır.

int x = -16;  // ikili sayı sisteminde:		1111111111110000
int y = 3;
int sonuc = x >> y;  // ikili sayı sisteminde:	1111111111111110

Bu davranış işaret genişletme olarak adlandırılır ve genellikle istenmeyen bir davranıştır. Sol tarafa işaret bit’i yerine her zaman sıfır eklemek isteyebilirsiniz. Bunun için (unsigned int) kullanmanız gerekir.

int x = -16;  // ikili sayı sisteminde: 1111111111110000
int y = 3;
int sonuc = (unsigned int)x >> y;  // ikili sayı sisteminde: 0001111111111110

İşaret genişletme davranışı konusunda dikkatli olursanız, sağa kaydırma operatörünü sol taraftaki operandı 2’nin kuvvetlerine bölmek için kullanabilirsiniz.

Örnek olarak:

int x = 1000;
int y = x >> 3; // 1000 tamsayısı 23 e bölünür, y = 125 olur
Was this page helpful?