& ,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