2 Haziran 2020 Salı

BitSet Sınıfı

Giriş
Açıklaması şöyle.
A BitSet is not safe for multithreaded use without external synchronization.
BitSet sınıfı bitleri bir long dizisi şeklinde saklar.
 /**
 * The internal field corresponding to the serialField "bits".
 */
 private long[] words;
Bence BitSet çok gıcık bir sınıf çünkü

- size() metodu içinde kaç tane bit saklanabileceğini belirtir. Hep 64 ve katıdır
- length() metodu ise en soldaki 1 olan bitin konumunu verir. 
Örnek
Elimizde şöyle bir kod olsun. Bir daha belirtilen kapasite olan 3 değerine ulaşma imkanı yok
BitSet bs = new BitSet(3);
System.out.println(bs.size()); //64
System.out.println(bs.length()); //0
bs.set(0);
System.out.println(bs.length()); //1
constructor
Şöyle yaparız.
BitSet bits = new BitSet();
constructor
Kaç bit büyüklüğünde bellek istediğimizi belirtiriz.
Örnek
Şöyle yaparız.
BitSet bits = new BitSet((1<<31)- 1);
cardinality metodu
Kaç tane true olduğunu döndürür. 
Örnek
Şöyle yaparız.
int numberOfTrues = bits.cardinality();
Örnek
Şöyle yaparız
BitSet bitSet = new BitSet(3); // 3 bits
bitSet.set(0); // sets position 0 to true
bitSet.set(1); // sets position 1 to true
bitSet.set(2); // sets position 2 to true

int cardinality = bitSet.cardinality();
System.out.println(cardinality);

// Output: 3
get metodu - int
Örnek
Şöyle yaparız.
int i = ...;
boolean v = bits.get(i);
Örnek
Şöyle yaparız.
int i = 0
if (!bits.get(i)) {
  ...  
}
get metodu - fromIndex + toIndex
[fromIndex , toIndex) arasındaki bitleri yeni bir BitSet olarak döner.

length  metodu
length() mantıksal uzunluğunu verir.
Örnek
Şöyle yaparız
BitSet bits = ...;
System.out.println("Bitset length: " + bitSet.length());
Çıktı olarak şunu alırız.
Bitset length: 41
nextClearBit metodu
Belirtilen konumdan sonra gelen ilk 0 değerine sahip bit adresini döndürür.

set metodu - int
Belirtilen indekse değer atar.
Örnek
Şöyle yaparız.
int i = 0; i < 10; i++) {
bits.set(i,true);
set metodu - int + int
[from - to) aralığını true yapar. Şöyle yaparız.
BitSet bset = new BitSet(N); // Initial capacity for N bits.
bset.set(0, N); // Set a range to true for 0 upto N-1.
size metodu
Sınıf içinde toplam kaç bit depolanacağını verir.  size() sonucu long [] olduğu için hep 64 bit ve katı olacaktır.
Örnek
Şöyle yaparız
BitSet bits = 
System.out.println("Bitset size: " + bits.size());
Çıktı olarak şunu alırız.
Bitset size: 64
Örnek
Bu metod biraz problemli. Elimizde şöyle bir kod olsun. Burada signed integer overflow problemi var.
BitSet bs = new BitSet(Integer.MAX_VALUE);
System.out.println(bs.size()); //-2147483648
Açıklaması şöyle
 A BitSet may hold up to (Integer.MAX_VALUE + 1) bits, so size() physically cannot return all possible values.
Şöyle yaparız
BitSet bs = new BitSet(Integer.MAX_VALUE);
long longSize = Integer.toUnsignedLong(bs.size()); // will be 2147483648
toByteArray metodu
Şöyle yaparız.
bitSet.toByteArray();
toLongArray metodu
Şöyle yaparız
int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];
valueOf metodu - byte []
byte[] Little Endian olmalıdır. Yani Java içindeki bir long değişkeni byte[] haline çevirip valueOf() metoduna verirsek Java Big Endian olduğu için istediğimiz şeyi elde edemeyiz.

Örnek
Şöyle yaparız.
byte b = ...;
BitSet bitSet = BitSet.valueOf(new byte[] { b });
valueOf metodu - long []
Şöyle yaparız.
long currentTimeMillis = System.currentTimeMillis();
BitSet bitSet = BitSet.valueOf(new long[]{currentTimeMillis});








Hiç yorum yok:

Yorum Gönder