Herkese merhabalar. Bu yazıda sizlere bitwise operatörleri nedir, nasıl kullanılır bunları göstereceğim.
Öncelikle bilmeliyiz ki bilgisayardaki her harfin, her sayının, her karakterin kısaca her şeyin ikilik sistem (Binary) yani 0 ve 1’lerle karşılığı vardır.
Bu yazıda binary sayıların ayrıntısına inmeyeceğim. Sadece Java dilinde bitwise operatörleri ile nasıl işlem yapabileceğimizi göstereceğim.
Not: Bitwise operatörlerinin gösterimi C dilinde için de aynıdır.
Ayrıntıya inmeyeceğim dedim fakat onluk (Decimal) sayının nasıl binary karşılığını yazacağımızı bilmemiz gerek.
Örnek olarak 42 sayısını ele alalım.

Görüldüğü gibi binary sayılar sağdan itibaren 2 üzeri 0 ile başlayıp üssü birer artarak sıralanıyor.
42 sayısı için 101010 şeklinde gösterirken, 38 sayısı 100110 şeklinde yazılabilir.
Şimdi sıra sayıların ikilik şekilleri ile işlem yapacağız.

Yukarıdaki tablo bize bitwise operatörlerini gösteriyor. Bu operatörleri sıradan ele alıp ne işe yaradıklarına bakalım. Anlaşılması adına her operatörle ilgili de birer örnek göstereceğim.
AND, VE (&) Operatörü: İki sayının ve’sini alır. Her iki bit 1 olduğu durumlarda 1, farklı olduğu durumlarda ise 0 değerini alır.
/* 00101010 00100110 -------- AND 00100010 */ int a = 42; // 00101010 int b = 38; // 00100110 System.out.println(a & b); // 34 -> 00100010
OR, VEYA (|) Operatörü: İki sayının veya’sını alır. Bitlerden herhangi birisi 1 olduğu durumlarda 1, ikisi de 0 olduğu durumlarda ise 0 değerini alır.
/* 00101010 00100110 ------ OR 00101110 */ int a = 42; // 00101010 int b = 38; // 00100110 System.out.println(a | b); // 46 -> 00101110
XOR, ÖZEL VEYA (^) Operatörü: İki sayının özel veya’sını alır. Bitlerden ikisi aynı olduğunda 0, farklı olduğu durumlarda 1 değerini alır.
/* 00101010 00100110 -------- XOR 00001100 */ int a = 42; // 00101010 int b = 38; // 00100110 System.out.println(a ^ b); // 12 -> 00001100
Complement, Tümleyen (~) Operatörü: Sayının 1 tümleyenini yani negatifini alır.
/* 00101010 -------- ~ 11010101 -> 213 (Binary) */ int a = 42; System.out.println("Sayi: " + a); // -> 42 System.out.println(Integer.toBinaryString(a)); // -> 00101010 System.out.println("Sonuc: " + ~a); // -> -43 System.out.println(Integer.toBinaryString(~a)); // -> 11010101
Aslında çıktının 213 olmasını bekliyoruz, fakat öyle değil.
En baştaki bitin işaret biti olduğunu kabul edersek (0 için pozitif, 1 için negatif) işaret bitinin değerinden diğer bitlerin değerlerinin toplamını çıkarırsak bize sonucu verir.
42 sayısı için 128 – (64 + 16 + 4 + 1) = 43. Yani -43.
Bir diğer yöntem ise şu: Her sayının negatifi kendisinden 1 fazladır.
128 adet sayımız olsun. 64 negatif, 64 pozitif şeklinde. Fakat 0 da bu duruma dahil olduğu için pozitif sayılar 63’e kadar gider. Negatifler de -64. Bu yüzden 63’ün negatifi yani 1 tümleyeni -64 olarak kabul edilir.
Tekrardan 63 için düşünürsek; sayının 2 tümleyenini alırsak yani 1 tümleyenine +1 eklersek, sayımız -63 olur. Sayının negatif gösterimi aynı zamanda 2 tümleyeni ile de gösterilebilir.
63 sayısı için;
1 Tümleyen -> -64
2 Tümleyen -> -63
Shift Left (<<) Operatörü: Sayının bitlerini istenilen basamak kadar sola kaydırır ve kaydırdığı yerlere sıfır ekler.
/* 00101010 -------- << 10101000 -> 168 */ int a = 42; // 00101010 System.out.println("Sonuc: " + (a << 2)); // 10101000
Shift Right (>>) Operatörü: Sayının bitlerini istenilen basamak kadar sağa kaydırır ve kaydırdığı yerlere sıfır ekler.
Fakat burada bir şey daha var. Shift right operatörü işaretlidir ve negatif sayının negatif biti korunur.
/* 00101010 -------- >> 00001010 -> 10 */ int a = 42; // 00101010 System.out.println("Sonuc: " + (a << 2)); // 00001010
Unsigned Shift Right (>>>) Operatörü: Shift right operatöründen tek farkı unsigned (işaretsiz) olmasıdır, yani sayının işaret biti korunmadan kaydırılır ve 0 eklenir.
int a = -42; System.out.println("Sonuc: " + (a >> 2)); // -3 a = -42; System.out.println("Sonuc: " + (a >>> 2)); // 1073741821
İşaretsiz kaydırma yaptığımız zaman sayının işaret biti korunmadığı için çok büyük bir değer çıktı.
Merhaba binary sayısının nasıl yazıldığını 10 luktan 2 lik sisteme nasıl çevrildiğini ayrıntılı olarak anlatabilir mısınız? Faydalı içerikler için teşekkür ederim.
Merhabalar. Konu anlatımı da yapabilirim seve seve; fakat internette Bilgisayar Bilimi, Bilgisayar Mühendisliği ile ilgili çok iyi kaynaklar zaten mevcut. Bu tür temel konular başarılı şekilde işlenmiş. Ben ise Türkçe kaynağı çok olmayan, hatta hiç kaynağı olmayan konuları işlemeyi tercih ediyorum. Böylece topluluğa daha fazla faydamın dokunacağını düşünüyorum. Değerli yorumunuz için teşekkür ederim.