본문 바로가기

Programming/Java

Bit Vector in Java

Programming 하다보면, Bit Vector 를 사용할 일이 생긴다.

그래서 찾아보았는데, 역시나 Java API 안에 Bit Vector 가 이미 훌륭하게 구현이 되어 있었다.
이름하여, BitSet class

이 클래스는 java.util package 안에 있다.

java.util
 
Class BitSet


This class implements a vector of bits that grows as needed. Each component of the bit set has a boolean value. The bits of a BitSet are indexed by nonnegative integers. Individual indexed bits can be examined, set, or cleared. One BitSet may be used to modify the contents of another BitSet through logical AND, logical inclusive OR, andlogical exclusive OR operations.


(이 클래스는 Bit Vector 를 구현한 것으로서 필요에 의해서 사이즈가 커진다. bit set 의 각각의 요소는 boolean 값을 가지고 있다. BitSet 의 bit 들은 음수가 아닌 정수에 의해서 인덱싱이 된다. 각각의 인덱식된 bit 들은 조회가능하고, set 혹은 clear 될 수 있다. 어떤 BitSet 은 또 다른 BitSet 의 내용을 논리 AND, OR, XOR 를 통하여 변경할 수 있다.)


By default, all bits in the set initially have the value false.


(기본적으로 BitSet 의 모든 bit 들은 false 값으로 초기화 되어있다.) 


Every bit set has a current size, which is the number of bits of space currently in use by the bit set. Note that the size is related to the implementation of a bit set, so it may change with implementation. The length of a bit set relates to logical length of a bit set and is defined independently of implementation.


(모든 bit set 은 현재의 크기를 가지고 있는데, 그것은 bit set 에 현재 사용되는 공간에 존재하는 bit 들의 갯수이다. bit set 은 구현에 따라서 변할 수 있도록  bit set 의 구현이 크기와 관련이 있다는 것을 주의 해야 한다. bit set 의 길이는 bit set 의 논리적 길이와 연관이 있고, 이것은 구현과는 별개로 구현이 정의되어 있다.) 


Unless otherwise noted, passing a null parameter to any of the methods in a BitSet will result in a NullPointerException.


(BitSet 의 모든 method 에 null 값을 입력하게 되면, NullPointerException 을 발생 시킬 것이다.) 



A BitSet is not safe for multithreaded use without external synchronization.


(BitSet 은 외적인 동기화가 없이 사용된다면 multi threaded 환경에서 안전하지 않다.) 



예를 들어보자.

// Create the bitset
BitSet bits = new BitSet();

// Set a bit on
bits.set(2);                        // 100 = decimal 4

// Retrieving the value of a bit
boolean b = bits.get(0);            // false
b = bits.get(2);                    // true

// Clear a bit
bits.clear(1);

// Setting a range of bits
BitSet bits2 = new BitSet();
bits2.set(1, 4);                    // 1110

// And'ing two bitsets
bits.and(bits2);                    // 0100

// Xor'ing two bitsets
bits.xor(bits2);                    // 1010

// Flip all bits in the bitset
bits.flip(0, bits.length());        // 0101

// Andnot'ing two bitsets
bits.andNot(bits2);                 // 0001

// Or'ing two bitsets 
bits.or(bits2); // 1111 


(from: http://www.exampledepot.com/egs/java.util/Bits.html)