"Enter"a basıp içeriğe geçin

Bitwise Operatörleri Nedir? Nasıl Kullanılır?

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.

42 sayısının ikilikten onluğa çevrimi

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.

Bitwise operatörleri

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ı.

2 Yorum

  1. Nimet Bayraktar Nimet Bayraktar 17 Ocak 2020

    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.

    • Furkan Alp Tokaç Furkan Alp Tokaç 17 Ocak 2020

      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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir