개념
정수를 비트로 표현하기
정수의 이진 표현에서 각 자리는 또는 입니다. 오른쪽 끝을 0번째 비트라고 하며, 번째 비트의 값은 입니다. 여러 항목의 선택 여부를 한 정수의 비트들에 저장할 수 있습니다.
| 연산 | 기호 | 의미 |
|---|---|---|
| AND | & | 두 비트가 모두 1이면 1 |
| OR | | | 하나 이상 1이면 1 |
| XOR | ^ | 두 비트가 다르면 1 |
| NOT | ~ | 각 비트를 반전 |
| 왼쪽 이동 | << | 비트를 왼쪽으로 이동 |
| 오른쪽 이동 | >> | 비트를 오른쪽으로 이동 |
예를 들어 , 이면 AND는 , OR는 , XOR는 입니다.
특정 비트 확인·변경
음이 아닌 정수 x의 k번째 비트에 다음 연산을 적용합니다.
| 동작 | C++ | Java | Python |
|---|---|---|---|
| 1인 비트 마스크 | 1 << k | 1 << k | 1 << k |
| 비트 값 확인 | (x >> k) & 1 | (x >> k) & 1 | (x >> k) & 1 |
| 비트를 1로 설정 | x | (1 << k) | x | (1 << k) | x | (1 << k) |
| 비트를 0으로 설정 | x & ~(1 << k) | x & ~(1 << k) | x & ~(1 << k) |
| 비트 반전 | x ^ (1 << k) | x ^ (1 << k) | x ^ (1 << k) |
C++과 Java에서는 비트를 옮기는 칸 수가 자료형의 비트 수보다 작아야 하며, 계산 결과가 자료형의 범위 안에 들어가는지도 확인합니다. Python의 ~x는 -x-1이므로 하위 비트만 반전하려면 x ^ ((1 << K) - 1)을 사용합니다. 이 식은 원래 값이 일 때 해당 범위의 비트를 반전합니다.
복잡도
예제의 고정된 정수 범위를 기준으로 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 비트 확인·설정·제거·반전 | 추가 |
예제
문제
정수 의 번째 비트를 확인하고, 해당 비트를 각각 설정·제거·반전한 결과를 구하여라. 각 연산은 원래 에 적용한다.
입력
첫째 줄에 정수 와 비트 번호 가 공백을 사이에 두고 주어진다. ; 이다. 비트 번호는 오른쪽 끝에서 부터 센다.
출력
원래 비트 값, 로 설정한 결과, 으로 설정한 결과, 반전한 결과를 공백으로 구분하여 출력한다.