
비트 연산 문제를 처음 접하면 익숙하지 않은 기호들 때문에 어렵게 느껴지지만, 한 번 감이 잡히면 굉장히 재미있는 카테고리다.
이번 글에서는 LeetCode 190번 문제인 Reverse Bits를 풀면서,
내가 처음 짠 풀이와 흔히 “정석 풀이”라고 불리는 접근법을 비교해본다.
https://leetcode.com/problems/reverse-bits/description/
32비트 정수 n이 주어지면, 이 값을 이진수 비트 단위로 완전히 뒤집은 숫자를 반환하는 문제다.
예를 들어,
00000010100101000001111010011100
을 뒤집으면
00111001011110000010100101000000
이 되고, 이 값을 다시 십진수로 바꾼 것이 정답이다.
처음에는 비트를 하나씩 읽어서, “뒤집었을 때 그 비트가 있어야 하는 자리”를 구해
2^(31 - i)을 더하는 방식으로 해결했다.
public int ReverseBits(int n)
{
int answer = 0;
for (int i = 0; i < 32; i++)
{
answer += ((n >> i) & 1) * (int)MathF.Pow(2, 31 - i);
}
return answer;
}
비트 뒤집기는 결국 “비트를 하나씩 꺼내서 반대쪽 끝에 쌓는” 작업이다.
정석 풀이에서는 이를 비트 이동 연산 (<<, >>, |, &)만 사용해 구현한다.
public int ReverseBits(int n)
{
int answer = 0;
for (int i = 0; i < 32; i++)
{
answer <<= 1; // answer를 왼쪽으로 이동해 자리 확보
answer |= (n & 1); // n의 마지막 비트를 answer에 추가
n >>= 1; // n을 오른쪽으로 밀어 다음 비트를 준비
}
return answer;
}
비트 연산 문제는 처음엔 낯설지만,
이 문제처럼 한두 가지 패턴만 익혀도 금방 재밌어진다.
이번 문제를 통해:
을 한 번에 익힐 수 있었다.
| 비트 연산으로 이해하는 2의 거듭제곱 - Math.Pow 대신 1 << n을 사용하는 이유 (0) | 2025.12.12 |
|---|---|
| LeetCode 136. SingleNumber — XOR 연산 응용 (0) | 2025.12.11 |
| LeetCode 191 — Number of 1 Bits (이진수에서 1 개수 세기) (0) | 2025.12.11 |
| 퀵정렬 원리 아주 쉽게 이해하기(Quick Sort) (0) | 2024.11.08 |
| 백준 1316 - 그룹 단어 체커 (파이썬) (0) | 2021.01.16 |