Bitsel operatörler değişken ve veriler üzerinde bit seviyesinde VE, VEYA, DEĞİL, XOR, bit kaydırma gibi işlemler yapmak için kullanılan operatörlerdir.
Arduino dilinde 6 adet bitsel operatör vardır. Bunlar;
Operatörün solundaki değerle, sağındaki değeri bitsel VE işlemine tabi tutmak için kullanılır. Operatörün sembolü “&” karakteridir.
Bilindiği üzere VE (AND) işlemi yalnızca her iki veri de 1 (true) ise 1 (true) sonuç verir. Diğer durumlarda 0 yani (false) sonuç döndürür.
VE (AND) işlemine tabi tutulmuş A ve B verisinin Y çıkışındaki doğruluk tablosu aşağıdaki gibidir.
Yukarıdaki doğruluk tablosuna göre A ve B verisinin yalnızca her ikisi de True ise True çıkış verdiği, herhangi biri ya da her ikisi de yanlış ise yanlış çıkış verdiği görülüyor.
Örnek olarak 22 ve 29 değerinde iki adet binary sayımız olsun ve bu iki sayıyı bitsel VE operatörüne tabi tutalım;
A = 22 sayısının binary değeri; 10110
B = 29 sayısının binary değeri; 11101
Y = A&B
Yukarıdaki doğruluk tablosunu göz önünde bulundurursak
1 2 3 4 |
A = 0 0 0 1 0 1 1 0 // 22 sayısının binary karşılığı B = 0 0 0 1 1 1 0 1 // 29 sayısının binary karşılığı &____________________ Y = 0 0 0 1 0 1 0 0 // A&B = 20 |
Yukarıdaki kod sadece örnek amaçlı verilmiştir gerçek kod değildir. Yukarıdaki örnekte sadece alt alta 1 gelen veriler çıkışa 1 olarak yansımıştır. Diğerleri 0 olarak yansımıştır.
Şimdi örneğimizi gerçek kodlarla yapalım.
Örnek olarak 22 sayısı ile 29 sayısını bitsel VE işlemine tabi tutalım;
1 2 3 4 5 6 7 8 9 |
byte sayi1 = 22; // decimal 22 = binary 10110 byte sayi2 = 29; // decimal 29 = binary 11101 byte sonuc = sayi1 & sayi2; // sayi1 ile sayi2'yi bitsel VE işlemine tabi tutuyoruz Serial.println(sonuc); // Sonucu seri porta yaz /* * Seri porta "20" yazar */ |
Operatörün solundaki değerle, sağındaki değeri bitsel VEYA işlemine tabi tutmak için kullanılır. Operatörün sembolü “|” karakteridir.
Bilindiği üzere VEYA (OR) işlemi iki girdiden herhangi biri “1” (true) ise “1” (true) sonuç verir. Diğer durumlarda “0” yani (false) sonuç döndürür.
VEYA (OR) işlemine tabi tutulmuş A ve B verisinin Y çıkışındaki doğruluk tablosu aşağıdaki gibidir.
Yukarıdaki doğruluk tablosuna göre A ve B verisinden herhangi biri “1” yani true olduğunda Y çıkışı “1” yani true değer alır. Eğer girdilerden her ikisi de “0” yani false ise, çıkıştan “0” yani false değer alınır.
Örnek olarak 22 ve 29 değerinde iki adet binary sayımız olsun ve bu iki sayıyı bitsel VEYA operatörüne tabi tutalım;
A = 22 sayısının binary değeri; 10110
B = 21 sayısının binary değeri; 10101
Y = A|B
Yukarıdaki doğruluk tablosunu göz önünde bulundurursak ve her bir biti alt alta VEYA işlemine tabi tutarsak;
1 2 3 4 |
A = 0 0 0 1 0 1 1 0 // 22 sayısının binary karşılığı B = 0 0 0 1 0 1 0 1 // 21 sayısının binary karşılığı |____________________ Y = 0 0 0 1 0 1 1 1 // A&B = 23 |
Yukarıdaki örnek gösterimde doğruluk tablosunda olduğu gibi alt alta gelen bitlerden herhangi biri ya da her ikisi de “1” olan bitler Y çıkışında 1 olarak yansımıştır. Yalnızca alt alta 0 gelen bitler çıkışa 0 olarak yansımıştır.
Şimdi yukarıdaki örneği arduino kodları ile yapalım;
1 2 3 4 5 6 7 8 |
byte sayi1 = 22; // decimal 22 = binary 10110 byte sayi2 = 21; // decimal 29 = binary 11101 byte sonuc = sayi1 | sayi2; // sayi1 ile sayi2'yi bitsel VEYA işlemine tabi tutuyoruz Serial.println(sonuc); // Sonucu seri porta yaz /* * Seri porta 23 yazar */ |
Operatörün sağındaki değeri bitsel DEĞİL işlemine tabii tutar. Operatörün sembolü (~) karakteridir. Bitsel DEĞİL operatörü bir sayının tüm bitlerini tersine çevirir. Yani “1” olan bitleri “0”, “0” olan bitleri “1” yapar.
Şimdi değiş işleminin girdi ve çıktı doğruluk tablosunu inceleyelim;
Doğruluk tablosunda görüldüğü üzere “1” yani true olan girişler çıkışa “0” yani false olarak yansıyor. Tam tersi, girişte “0” olan değer ise çıkışta “1” oluyor.
Şimdi isterseniz decimal 125 sayısın değil işlemine tabi tutalım;
1 2 3 |
A = 0 1 1 1 1 1 0 1 // 125 sayısının binary karşılığı ~____________________ Y = 1 0 0 0 0 0 1 0 // ~A = 130 |
Şimdi yukarıdaki örneği arduino kodları ile yapalım;
1 2 3 4 5 6 7 |
byte sayi1 = 125; // decimal 125 = binary 10110 byte sonuc = ~sayi1; // sayi1'i DEĞİL işlemine tabi tutuyoruz Serial.println(sonuc); // Sonucu seri porta yaz /* * Seri porta 130 yazar */ |
Bitsel XOR operatörü, operatörün solundaki değer ile sağındaki değeri XOR işlemine tabii tutar. Operatörün semblü “^” karakteridir. XOR operatörü yalnızca iki girdiden herhangi biri “1” yani true ise, “1” yani true sonuç döndürür. Eğer XOR işlemine tabi tutulan bitlerin her ikiside “1” ya da her ikisi de “0” ise, “0” yani false sonuç döndürür.
1 2 3 4 |
A = 0 0 1 1 // decimal 3 B = 0 1 0 1 // decimal 5 ^_____________ Y = 0 1 1 0 // (A ^ B) - decimal 6 |
Yukarıdaki örneği arduino ile yapacak olursak;
1 2 3 4 5 6 7 8 |
byte sayi1 = 3; // decimal 22 = binary 0011 byte sayi2 = 5; // decimal 5 = binary 0101 byte sonuc = sayi1 ^ sayi2;; // sayi1 ile sayi2'yi bitsel VE işlemine tabi tutuyoruz Serial.println(sonuc); // Sonucu seri porta yaz /* * Seri porta 6 yazar */ |
Görüldüğü üzere karşılıklı bitlerden birbirinin zıttı olanlar “1”, birbirinin aynı olan bitler ise “0” değer döndürdüler.
Sola kaydırma operatörü, bir değerin en sağdaki bitlerinden istediğimiz kadarını sola kaydırarak, sağ tarafa “0” değeri yerleştirir. En soldan taşan bir bitler ise kaybolur.
Sözdizimi: sayi << 3;
Örnek olarak 187 sayısını 3 bit sola kaydıralım;
187 sayısının binary değeri 10111011 ‘dir. Biz bu değeri 3 bit sola kaydırırsak aşağıda kırmızı olarak belirtilen 3 bit kaybolur ve kaydırılan değer kadar aşağıda yeşil olarak belirtilen 0 değerleri eklenir;
187 << 3 = 10111011000 yeni sayımız ise 11011000 = 216 oldu.
Şimdi bu örneği arduino kodları ile yapalım;
1 2 3 4 5 6 7 |
byte sayi1 = 187; // decimal 187 = binary 10111011 byte sonuc = sayi1 << 3; // sayi1 değişkeni değerini 3 bit sola kaydır Serial.println(sonuc); // Sonucu seri porta yaz /* * Seri porta binary 11011000 = decimal 216 yazar */ |
Sola kaydırma operatörünün tam tersi işlem yapar. Belirlenen değer kadar biti sağa kaydırma işlemi yapar. Sağa kaydırma değeri kadar değerin sol tarafına “0” ekler, sağdan taşan bitler ise yok olur.
Sözdizimi: sayi >> 3;
Örnek olarak 187 sayısını 3 bit sola kaydıralım;
187 sayısının binary değeri 10111011 ‘dir. Biz bu değeri 3 bit sola kaydırırsak aşağıda kırmızı olarak belirtilen 3 bit kaybolur ve kaydırılan değer kadar aşağıda yeşil olarak belirtilen 0 değerleri eklenir;
187 << 3 = 00010111011 yeni sayımız ise 00010111 = 23 oldu.
Şimdi bu örneği arduino kodları ile yapalım;
1 2 3 4 5 6 7 |
byte sayi1 = 187; // decimal 187 = binary 10111011 byte sonuc = sayi1 >> 3; // sayi1 değişkeni değerini 3 bit sola kaydır Serial.println(sonuc); // Sonucu seri porta yaz /* * Seri porta binary 0001011 = decimal 23 yazar */ |