Eğitim Portalı/Java/Bitwise (Bit Düzeyi) Operatörler
Java01-java/90-bitwise-operatorler

Bitwise (Bit Düzeyi) Operatörler

Bit operatörleri, sayıları bir bütün olarak değil, onları oluşturan tek tek bitler (0/1) üzerinde işler. Günlük iş kodunda nadir görünseler de; izin/bayrak sistemleri, performans-kritik kod, grafik, ağ protokolleri ve…

Bitwise (Bit Düzeyi) Operatörler

Bit operatörleri, sayıları bir bütün olarak değil, onları oluşturan tek tek bitler (0/1) üzerinde işler. Günlük iş kodunda nadir görünseler de; izin/bayrak sistemleri, performans-kritik kod, grafik, ağ protokolleri ve gömülü sistemlerde vazgeçilmezdirler. Ayrıca teknik mülakatların sevdiği konulardandır. Bu konu, bit operatörlerini ve gerçek kullanım kalıplarını ele alır.

Mantıksal bit operatörleri

OperatörAdKural
&ANDHer iki bit de 1 ise 1
|OREn az biri 1 ise 1
^XORBitler farklıysa 1
~NOTTüm bitleri ters çevir
0b1100 & 0b1010 == 0b1000   // AND
0b1100 | 0b1010 == 0b1110   // OR
0b1100 ^ 0b1010 == 0b0110   // XOR
~12 == -13                   // NOT (tüm bitler ters)

Örnek 1 (./Ornek1.java) bunları ikilik gösterimle yan yana gösterir. Hızlı bir hile: (n & 1) == 1 sayının tek olduğunu söyler (son bit).

Bit &| vs mantıksal &&||: Karıştırma! &&/|| boolean üzerinde çalışır ve kısa devre yapar (topic 89). &/| bit düzeyinde çalışır (ve boolean'larda kısa devre yapmaz).

Kaydırma (shift) operatörleri

x << n    // sola n bit kaydır  -> her kaydırma x'i 2 ile ÇARPAR
x >> n    // işaretli sağa kaydır -> işareti koruyarak BÖLER (/2^n)
x >>> n   // işaretsiz sağa kaydır -> üst bitlere 0 koyar
1 << 4 == 16     // 2^4
32 >> 2 == 8     // 32 / 4

Kaydırma, * 2 / / 2 işlemlerinin çok hızlı halidir (eskiden performans için kullanılırdı; bugün derleyici zaten optimize eder, ama bit kalıpları için hâlâ gerekli).

Gerçek kullanım 1: izin/bayrak maskeleri

En yaygın kullanım: birçok boolean bayrağı tek bir int'te tutmak. Her izin bir bittir:

static final int OKU = 1, YAZ = 1<<1, SIL = 1<<2, YONET = 1<<3;

int izin = OKU | YAZ;            // birden çok izni birleştir
boolean yazabilir = (izin & YAZ) != 0;  // bit açık mı? (kontrol)
izin |= SIL;                     // izin EKLE (bit aç)
izin &= ~YAZ;                    // izin KALDIR (bit kapat)

Bu kalıp; Unix dosya izinleri (rwx), EnumSet (içte bit-maske), olay maskeleri ve birçok API'de kullanılır. Örnek 2 (./Ornek2.java) bir izin sistemi kurar.

Gerçek kullanım 2: veri paketleme (RGB)

Birden çok küçük değeri tek bir sayıya sığdırmak için kaydırma + OR; geri çözmek için kaydırma + AND maskesi:

int rgb = (r << 16) | (g << 8) | b;     // 3 byte -> tek int (paketle)
int kirmizi = (rgb >> 16) & 0xFF;        // geri çöz

Renkler, ağ paketleri ve kompakt veri formatlarında yaygındır. Örnek 2 RGB paketleme/çözmeyi gösterir.

Diğer bit hileleri

  • n & 1 → tek/çift kontrolü.
  • n & (n-1) → en sağdaki 1 bitini siler (set bit sayma — Kernighan).
  • a ^ b ^ a == b → XOR ile takas / tekrarlı elemanı bulma.
  • Integer.bitCount(n), Integer.highestOneBit(n) → hazır yardımcılar.

Özet

Bit operatörlerini öğrendik: mantıksal bit işlemleri & | ^ ~ (ikilik gösterimle; Örnek 1) ve kaydırma << >> >>> ile iki güçlü gerçek kullanım — izin/bayrak maskeleri ve veri paketleme (RGB) (Örnek 2); bit &| ile mantıksal &&|| farkına ve faydalı bit hilelerine değindik. Sırada, kodunu belgelemenin standart yolu: Javadoc.

Kod Örnekleri(2)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: Bit operatörleri — & (ve), | (veya), ^ (xor), ~ (değil).
2// Çalıştırma: java Ornek1.java
3public class Ornek1 {
4
5    // Bir sayıyı 8 bitlik ikilik gösterimle yazdırır.
6    static String bin(int n) {
7        return String.format("%8s", Integer.toBinaryString(n & 0xFF)).replace(' ', '0');
8    }
9
10    public static void main(String[] args) {
11        int a = 0b1100; // 12
12        int b = 0b1010; // 10
13
14        System.out.println("a = " + bin(a) + " (" + a + ")");
15        System.out.println("b = " + bin(b) + " (" + b + ")");
16
17        // & (AND): her iki bit de 1 ise 1
18        System.out.println("\na & b = " + bin(a & b) + " (" + (a & b) + ")  AND: ikisi de 1");
19        // | (OR): bitlerden biri 1 ise 1
20        System.out.println("a | b = " + bin(a | b) + " (" + (a | b) + ")  OR: en az biri 1");
21        // ^ (XOR): bitler FARKLI ise 1
22        System.out.println("a ^ b = " + bin(a ^ b) + " (" + (a ^ b) + ")  XOR: farklıysa 1");
23        // ~ (NOT): tüm bitleri ters çevir (tamamlayan)
24        System.out.println("~a    = ...(" + (~a) + ")  NOT: tüm bitler ters (~12 = -13)");
25
26        // Tek/çift kontrolü bit ile: son bit 1 ise tek
27        int sayi = 7;
28        System.out.println("\n" + sayi + " tek mi? " + ((sayi & 1) == 1) + "  ((n & 1) ile)");
29
30        System.out.println("""
31
32                --- Bit operatörleri ---
33                Sayıları BİT düzeyinde işler (her bir 0/1 üzerinde):
34                  &  AND : ikisi de 1 ise 1   (maske uygulama, "bu bit açık mı?")
35                  |  OR  : en az biri 1 ise 1 (bit açma)
36                  ^  XOR : farklıysa 1        (bit ters çevirme, basit şifreleme, takas)
37                  ~  NOT : tüm bitleri ters çevir
38                Hızlı ve düşük seviyeli: bayrak/izin maskeleri, donanım, grafik, performans-kritik kod.
39                (Mantıksal && || ile karıştırma: onlar boolean+kısa devre; bunlar bit düzeyinde.)""");
40    }
41}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: Kaydırma operatörleri (<< >> >>>) ve gerçek kullanım — izin maskeleri, RGB.
2// Çalıştırma: java Ornek2.java
3public class Ornek2 {
4
5    // İzinler bit bayrağı olarak: her izin bir bit.
6    static final int OKU  = 1;       // 0001
7    static final int YAZ  = 1 << 1;  // 0010 (2)
8    static final int SIL  = 1 << 2;  // 0100 (4)
9    static final int YONET= 1 << 3;  // 1000 (8)
10
11    public static void main(String[] args) {
12        // KAYDIRMA: << sola (her kayma *2), >> sağa (işaretli, /2), >>> sağa (işaretsiz)
13        System.out.println("1 << 4 = " + (1 << 4) + "  (sola 4 -> 16, yani 2^4)");
14        System.out.println("32 >> 2 = " + (32 >> 2) + "  (sağa 2 -> 8, yani /4)");
15        System.out.println("-8 >>> 28 = " + (-8 >>> 28) + "  (işaretsiz sağ kaydırma)");
16
17        // İZİN MASKESİ: tek bir int'te birden çok bayrak tut (| ile birleştir, & ile kontrol et).
18        int editorIzin = OKU | YAZ;           // okuma + yazma
19        int adminIzin  = OKU | YAZ | SIL | YONET; // hepsi
20        System.out.println("\nEditör izni (ikilik): " + Integer.toBinaryString(editorIzin));
21        System.out.println("Editör YAZabilir mi? " + ((editorIzin & YAZ) != 0));   // bit açık mı?
22        System.out.println("Editör SİLebilir mi? " + ((editorIzin & SIL) != 0));
23        editorIzin |= SIL;                    // silme iznini EKLE (bit aç)
24        System.out.println("SİL eklendi -> silebilir mi? " + ((editorIzin & SIL) != 0));
25        editorIzin &= ~YAZ;                   // yazma iznini KALDIR (bit kapat)
26        System.out.println("YAZ kaldırıldı -> yazabilir mi? " + ((editorIzin & YAZ) != 0));
27
28        // RGB renk paketleme: 3 byte'ı tek int'e sığdır (bit kaydırma + maske).
29        int r = 255, g = 140, b = 0;
30        int rgb = (r << 16) | (g << 8) | b;   // paketle
31        System.out.printf("%nRGB(255,140,0) -> #%06X%n", rgb);
32        System.out.println("Geri çöz: r=" + ((rgb >> 16) & 0xFF)
33                + ", g=" + ((rgb >> 8) & 0xFF) + ", b=" + (rgb & 0xFF));
34
35        System.out.println("""
36
37                --- Kaydırma ve gerçek kullanım ---
38                << sola kaydır (her adım *2), >> işaretli sağa (/2), >>> işaretsiz sağa (üst bitlere 0).
39                İZİN/BAYRAK MASKESİ: her izin bir bit; | ile EKLE, & ~ ile KALDIR, & ile KONTROL ET
40                  -> birçok boolean'ı tek int'te kompakt tutar (EnumSet de içte bunu yapar).
41                RGB paketleme: << ve | ile 3 byte'ı tek int'e sığdır; >> ve & 0xFF ile geri çöz.
42                Bit hileleri performans-kritik kod, grafik, ağ protokolleri ve gömülü sistemlerde yaygındır.""");
43    }
44}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.