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ör | Ad | Kural |
|---|---|---|
& | AND | Her iki bit de 1 ise 1 |
| | OR | En az biri 1 ise 1 |
^ | XOR | Bitler farklıysa 1 |
~ | NOT | Tü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ılabilir1// 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}Ornek2
çalıştırılabilir1// 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}