WIPIVERSE

비트 벡터

정의
비트 벡터(Bit vector, bitset)는 고정된 길이의 0과 1로 구성된 배열을 의미한다. 각 원소는 단일 비트를 차지하며, 인덱스를 통해 개별 비트에 접근하고 수정할 수 있다. 일반적으로 이진 상태(예: 포함 여부, 사용 여부)를 효율적으로 표현하고 집합 연산을 수행하기 위해 사용된다.

주요 특성

  1. 저장 효율성: 한 비트당 1비트만 사용하므로 대규모 논리 집합을 압축된 형태로 저장할 수 있다.
  2. 상수 시간 연산: 비트 단위 연산(AND, OR, XOR, NOT 등)은 하드웨어 레벨에서 대부분 O(1) 시간에 수행된다.
  3. 고정 길이: 초기 생성 시 길이가 지정되며, 일반적인 구현에서는 동적으로 크기를 변경하지 않는다.

대표적인 연산

연산 설명
set(i) i번째 비트를 1로 설정
reset(i) i번째 비트를 0으로 설정
flip(i) i번째 비트를 토글
test(i) i번째 비트가 1인지 여부 반환
count() 전체 비트 중 1인 비트의 개수 반환
any() 1인 비트가 하나라도 존재하는지 여부 반환
none() 모든 비트가 0인지 여부 반환
operator&(다른 비트 벡터) 비트 단위 AND 연산 결과 반환
`operator (다른 비트 벡터)`
operator^(다른 비트 벡터) 비트 단위 XOR 연산 결과 반환

활용 사례

  • 집합 표현: 특정 범위의 정수를 포함 여부를 비트로 나타내는 경우 (예: 해시 충돌 회피, 비트맵 인덱스).
  • 플래그 저장: 여러 독립적인 상태를 하나의 정수형 변수에 압축 저장 (예: 파일 권한, 옵션 플래그).
  • 그래프 알고리즘: 방문 여부나 인접 행렬 대체 등에서 메모리 사용을 최소화.
  • 압축 데이터 구조: 라디컬(라디컬) 트리, 세그먼트 트리와 결합해 비트 레벨 검색 및 업데이트를 지원.

표준 라이브러리 지원
C++ 표준 라이브러리에서는 std::bitset<N>이 고정 길이 비트 벡터를 제공한다. Java에서는 java.util.BitSet이 가변 길이 비트 벡터 구현을 제공한다. Python에서는 int 타입을 비트 연산에 활용하거나 bitarray 외부 패키지를 사용한다.

제한 사항

  • 고정 길이: 초기 길이 지정 후에는 일반적인 구현에서 확대가 불가능하므로, 사용 목적에 맞는 크기를 사전에 판단해야 한다.
  • 스레드 안전성: 비트 단위 연산이 원자적(atomic)이지 않을 수 있어, 다중 스레드 환경에서는 동기화가 필요하다.

관련 개념

  • 비트 마스크: 특정 비트만을 선택하거나 변형하기 위해 사용되는 상수 값.
  • 비트 배열(bit array): 비트 벡터와 동일한 의미로 사용되는 경우가 많다.
  • 루프 업(lookup) 테이블: 비트 패턴을 미리 계산해 빠른 변환을 지원한다.

참고 문헌

  • C++ 표준 라이브러리 문서, std::bitset
  • Java SE API 문서, java.util.BitSet
  • Donald Knuth, The Art of Computer Programming, Volume 4, Fascicle 1 (Bitwise Operations)

본 문서는 확인된 자료에 근거하여 객관적·중립적으로 서술하였다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기