Eğitim Portalı/Java/BitSet Sınıfı
Java01-java/73-bitset

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çin HashSet uygundur. 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ılabilir
Ornek1.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.