비트 조작
비트 조작 (Bit manipulation) — C23
C에서 비트 하나하나를 세거나 가장 높은 비트를 찾는 작업은 자주 필요한데, 표준 라이브러리에는 오랫동안 정식 함수가 없었어요. 그래서 사람마다 while 반복문이나 컴파일러 내장 함수로 제각각 구현하곤 했죠. C23부터 이걸 표준화해서 <stdbit.h> 헤더로 제공하는 게 바로 비트 조작 라이브러리예요.
본문
<stdbit.h> 헤더(C23)는 부호 없는 정수의 비트를 다루는 타입 제네릭 함수 매크로 모음과, 스칼라 타입의 엔디언을 알려 주는 매크로 상수를 제공합니다.
함수
대부분 "연속된 비트를 센다"거나 "특정 비트의 위치를 찾는" 식의 작업을 해요. 모두 타입 제네릭 함수 매크로라서, 부호 없는 정수 값을 넘기면 그 타입에 맞는 결과를 돌려줍니다.
<stdbit.h>(C23)에 정의된 함수들입니다.
| 함수 | 동작 |
|---|---|
stdc_leading_zeros |
최상위 비트(MSB)에서 시작해 연속된 0 비트의 개수를 센다 |
stdc_leading_ones |
최상위 비트에서 시작해 연속된 1 비트의 개수를 센다 |
stdc_trailing_zeros |
최하위 비트(LSB)에서 시작해 연속된 0 비트의 개수를 센다 |
stdc_trailing_ones |
최하위 비트에서 시작해 연속된 1 비트의 개수를 센다 |
stdc_first_leading_zero |
최상위 비트에서 시작해 첫 0 비트의 위치를 찾는다 |
stdc_first_leading_one |
최상위 비트에서 시작해 첫 1 비트의 위치를 찾는다 |
stdc_first_trailing_zero |
최하위 비트에서 시작해 첫 0 비트의 위치를 찾는다 |
stdc_first_trailing_one |
최하위 비트에서 시작해 첫 1 비트의 위치를 찾는다 |
stdc_count_zeros |
부호 없는 정수 안의 0 비트 개수를 센다 |
stdc_count_ones |
부호 없는 정수 안의 1 비트 개수를 센다 |
stdc_has_single_bit |
숫자가 2의 정수 거듭제곱인지 확인한다 |
stdc_bit_width |
주어진 값을 표현하는 데 필요한 최소 비트 수를 찾는다 |
stdc_bit_floor |
주어진 값보다 크지 않은 가장 큰 2의 거듭제곱을 찾는다 |
stdc_bit_ceil |
주어진 값보다 작지 않은 가장 작은 2의 거듭제곱을 찾는다 |
매크로 상수
<stdbit.h>(C23)에 정의된, 엔디언을 나타내는 매크로 상수가 있어요.
| 상수 | 동작 |
|---|---|
__STDC_ENDIAN_LITTLE__, __STDC_ENDIAN_BIG__, __STDC_ENDIAN_NATIVE__ |
스칼라 타입의 엔디언을 나타낸다 (C23) |
참고
C23 표준(ISO/IEC 9899:2024)의 7.18절 "Bit and byte utilities <stdbit.h>"에 규정돼 있어요.
더 알아보기
stdc_leading_zeros— 최상위 비트부터 시작해 연속된 0 비트를 세는 함수 (C23).__STDC_ENDIAN_*— 스칼라 타입의 엔디언을 알려 주는 매크로 상수 (C23).- cppreference의 Bit manipulation 원문에서 전체 함수 목록과 규칙을 더 확인할 수 있어요.