BitSet이란?

JY
3 min readJan 31, 2018

BitSet은 Bit들로 이루어진 vector로, boolean 배열처럼 이용할 수 있다. boolean 배열에 비해 갖는 이점은 boolean 값은 1byte를 잡아먹지만 bit는 말그대로 1bit다! 한 값당 7bit씩 아낄 수 있다. 자주 이용되는 메소드들을 예제를 통해 알아보자.

Set & Get

import java.util.BitSet;public class Test {
public static void main(String[] args) {
BitSet b = new BitSet();
b.set(10);
b.set(100);
System.out.println(b.get(10)); // true
System.out.println(b.get(100)); // true
System.out.println(b.get(0)); // false
}
}

10번째, 100번째 인덱스 값의 bit를 true로 설정하고, get을 이용해 그 값들을 가져온 것. 추가적으로 boolean값을 주면 false로도 설정이 가능하다.

Flip

import java.util.BitSet;public class Test {
public static void main(String[] args) {
BitSet b = new BitSet();

b.set(2);
System.out.println(b.get(2)); // true
b.flip(2);
System.out.println(b.get(2)); // false
}
}

flip. 말그대로 뒤집는다 생각하면 된다. 단 원래값이 뭔지 알고 있을 때야 뒤집기도 가능하지 않을까

Get Range

import java.util.BitSet;public class Test {
public static void main(String[] args) {
BitSet b = new BitSet();
b.set(3);
b.set(5);
BitSet b2 = b.get(3,6);
for (int i = 0; i < 5; i++) {
System.out.println(b2.get(i));
}
}
}

개인적으로 이해하는 데 좀 시간이 걸려서 앞에서 소개한 get 메소드 예제와 인자 하나 추가된 것 빼고는 다를 바 없지만 이 예제도 넣어보았다. (제대로 이해시켜주는 글이 없길래… 포스트 작성 이유기도 하다) 어쨌든 이 코드의 결과는 이렇다.

true
false
true
false
false

기존의 b는 3, 5번째를 true로 갖고 있었다. 그래서 난 b2도 3,5번째 값을 true로 가져오는 줄 알았더니, 그게 아니라 get에서 지정한 startIndex와 endIndex를 바탕으로 아예 새로운 BitSet을 만든다고 봐야 된다. 그러니까 b2의 1번째는 b의 3번째, b2의 2번째는 b의 4번째 이런식이다.

이외에도 and, or, xor, intersects와 같은 비트연산자를 이용할 수 있는 메소드 등 다양하게 존재한다. 자세한 건 api를 확인하는 것이 좋다.

--

--