BitSet Sınıfı
BitSet, otomatik büyüyen bir bit dizisidir: her bayrak (true/false) yalnızca 1 bit yer kaplar. Çok sayıda açık/kapalı durumu (izinler, varlık kümeleri, "görüldü mü" işaretleri) tutmak için boolean[]'dan çok daha kompa…
BitSet Sınıfı
BitSet, otomatik büyüyen bir bit dizisidir: her bayrak (true/false) yalnızca 1 bit yer
kaplar. Çok sayıda açık/kapalı durumu (izinler, varlık kümeleri, "görüldü mü" işaretleri) tutmak
için boolean[]'dan çok daha kompakt ve hızlıdır; üstelik bit düzeyinde küme işlemleri sunar. Bir
boolean[] her eleman için ~1 bayt harcarken, BitSet 8 bayrağı tek bir bayta sığdırır.
Temel bit işlemleri
BitSet b = new BitSet(64); // 64 bitlik (gerektiğinde otomatik büyür) b.set(3); // 3. biti aç b.get(3); // 3. bit açık mı? b.clear(3); // kapat b.flip(2); // tersine çevir b.cardinality(); // açık bit sayısı b.nextSetBit(0); // belirli konumdan sonraki açık bit b.nextClearBit(0); // sonraki kapalı bit
Örnek 1 (./Ornek1.java) bunları gösterir.
Küme işlemleri (çok hızlı)
İki BitSet arasında bit düzeyinde mantıksal işlemler — küme cebiri gibi davranır:
a.and(b); // kesişim (AND) a.or(b); // birleşim (OR) a.xor(b); // simetrik fark (XOR) a.andNot(b); // fark (a \ b)
Bu işlemler kelime (word) düzeyinde yapıldığından, büyük kümelerde HashSet<Integer>'dan çok daha
hızlı ve kompakttır. Örnek 1 AND/OR/XOR'u gösterir.
Gerçek senaryo: Eratosthenes Eleği
BitSet'in klasik kullanımı asal sayı eleğidir: N'e kadar her sayının asal/bileşik durumunu N
bitte tutar. 2'den başlayıp her asalın katlarını "bileşik" işaretler; işaretlenmeyenler asaldır:
BitSet bilesik = new BitSet(N + 1); for (int i = 2; (long) i*i <= N; i++) if (!bilesik.get(i)) for (int k = i*i; k <= N; k += i) bilesik.set(k); // asallar = bilesik.nextClearBit(...) ile gezilen, işaretlenmeyenler
Örnek 2 (./Ornek2.java) bunu uygular. boolean[N] yerine BitSet kullanmak ~8 kat az bellek
harcar ve nextClearBit ile asalları hızlı gezeriz.
Ne zaman BitSet?
- Çok sayıda (binlerce/milyonlarca) boolean bayrak tutman gerektiğinde.
- Yoğun küme işlemleri (kesişim/birleşim) yaptığında — özellikle anahtarlar yoğun küçük tamsayılarsa.
- Bit-maske/izin sistemleri, bloom-filter benzeri yapılar, grafik algoritmalarında "ziyaret edildi" işaretleri.
Anahtarlar enum ise
EnumSet(içte yine bit-maske) daha tip-güvenlidir; rastgele/büyük nesne kümeleri içinHashSetuygundur.BitSet, yoğun tamsayı indeksli durumlar için idealdir.
Özet
BitSet'in bit başına 1 bayrak tutan kompakt yapısını; temel bit işlemlerini (set/clear/
flip/cardinality) ve hızlı küme işlemlerini (and/or/xor) (Örnek 1); gerçek bir uygulama
olan Eratosthenes eleğini (Örnek 2) öğrendik. Sırada, yapılandırma ve anahtar-değer çiftleri için
klasik sınıf: Properties.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: BitSet — bit dizisi: küçük bellekte çok sayıda boolean bayrak ve küme işlemleri.
2// Çalıştırma: java Ornek1.java
3import java.util.BitSet;
4
5public class Ornek1 {
6
7 public static void main(String[] args) {
8 BitSet bayraklar = new BitSet(64); // 64 bitlik (gerektiğinde büyür)
9
10 // set/get/clear/flip
11 bayraklar.set(1);
12 bayraklar.set(3);
13 bayraklar.set(5);
14 System.out.println("BitSet: " + bayraklar + " (set edilen bitler)");
15 System.out.println("bit 3 açık mı? " + bayraklar.get(3));
16 System.out.println("bit 2 açık mı? " + bayraklar.get(2));
17 bayraklar.clear(3); // kapat
18 bayraklar.flip(2); // tersine çevir (kapalı->açık)
19 System.out.println("clear(3)+flip(2) sonrası: " + bayraklar);
20 System.out.println("Açık bit sayısı (cardinality): " + bayraklar.cardinality());
21
22 // KÜME İŞLEMLERİ — iki bit kümesi arasında AND/OR/XOR
23 BitSet a = new BitSet(); a.set(0); a.set(1); a.set(2); // {0,1,2}
24 BitSet b = new BitSet(); b.set(1); b.set(2); b.set(3); // {1,2,3}
25
26 BitSet kesisim = (BitSet) a.clone(); kesisim.and(b); // {1,2}
27 BitSet birlesim = (BitSet) a.clone(); birlesim.or(b); // {0,1,2,3}
28 BitSet farkli = (BitSet) a.clone(); farkli.xor(b); // {0,3}
29 System.out.println("\na=" + a + ", b=" + b);
30 System.out.println("AND (kesişim): " + kesisim);
31 System.out.println("OR (birleşim): " + birlesim);
32 System.out.println("XOR (simetrik fark): " + farkli);
33
34 System.out.println("""
35
36 --- BitSet ---
37 Otomatik büyüyen bir BİT dizisidir: her bayrak yalnızca 1 bit yer kaplar (boolean[]'dan çok daha kompakt).
38 set/clear/flip/get tek bit; cardinality açık bit sayısı; nextSetBit ile gezinme.
39 and/or/xor/andNot ile küme işlemleri (çok hızlı, bit düzeyinde).
40 Kullanım: çok sayıda açık/kapalı bayrak, varlık kümeleri, asal eleği (sonraki örnek), izin maskeleri.""");
41 }
42}Ornek2
çalıştırılabilir1// Ornek2: BitSet ile Eratosthenes Eleği — N'e kadar asal sayıları bulma (gerçek senaryo).
2// Çalıştırma: java Ornek2.java
3import java.util.BitSet;
4
5public class Ornek2 {
6
7 public static void main(String[] args) {
8 int N = 50;
9
10 // bit[i] = true -> i BİLEŞİK (asal değil). Başta hepsi false (asal varsayılır).
11 BitSet bilesik = new BitSet(N + 1);
12 bilesik.set(0);
13 bilesik.set(1); // 0 ve 1 asal değil
14
15 for (int i = 2; (long) i * i <= N; i++) {
16 if (!bilesik.get(i)) { // i asalsa
17 for (int k = i * i; k <= N; k += i) // katlarını bileşik işaretle
18 bilesik.set(k);
19 }
20 }
21
22 // Asallar = işaretlenMEYEN bitler. nextClearBit ile gez.
23 System.out.print(N + "'e kadar asallar: ");
24 for (int i = bilesik.nextClearBit(2); i >= 0 && i <= N; i = bilesik.nextClearBit(i + 1)) {
25 System.out.print(i + " ");
26 }
27 System.out.println();
28 System.out.println("Asal sayısı: " + ((N + 1) - bilesik.cardinality())); // 0..N içinde işaretlenmeyenler
29
30 System.out.println("""
31
32 --- Eratosthenes Eleği (BitSet ile) ---
33 Klasik algoritma: 2'den başla, her asalın katlarını "bileşik" işaretle; kalanlar asaldır.
34 BitSet burada idealdir: N bit ile N sayının asal/bileşik durumunu kompakt tutar
35 (boolean[N]'e göre ~8 kat az bellek) ve nextClearBit ile asalları hızlı gezeriz.
36 Bu, BitSet'in "çok sayıda durumu az bellekte tutma ve bit düzeyinde gezme" gücünü gösterir.""");
37 }
38}