상세 컨텐츠

본문 제목

비트 연산으로 이해하는 2의 거듭제곱 - Math.Pow 대신 1 << n을 사용하는 이유

개발기록/자료구조 & 알고리즘

by 도리(Dory) 2025. 12. 12. 14:33

본문

Math.Pow(2, n) 대신  1 << n 을 쓰는 이유

2048 게임

 

 

 

알고리즘 문제를 풀다 보면 2ⁿ 형태의 값이 자주 등장한다.

C#에서는 흔히 다음과 같이 작성하기 쉽다.

 

int x = (int)Math.Pow(2, n);

 

하지만 이 경우, 더 적절한 표현은 다음이다.

 

int x = 1 << n;

 

 

 


 

비트 관점에서의 의미

 

정수 1을 이진수로 표현하면 다음과 같다.

 

1 = 0001

 

왼쪽 시프트 연산(<<)은 비트를 왼쪽으로 이동시키는 연산이다.

 

1 << 1 = 0010 (2)
1 << 2 = 0100 (4)
1 << 3 = 1000 (8)

 

즉, 비트를 한 칸 이동할 때마다 값은 2배가 된다.

 

1 << n == 2ⁿ

 

 

 


 

Math.Pow가 적절하지 않은 이유 - 부동소수점 연산

 

Math.PowMathF.Pow는 각각 double, float 기반의 연산이다.

 

Math.Pow(2, n)   // double
MathF.Pow(2, n)  // float

 

정수 연산이 필요한 상황에서 불필요한 부동소수점 계산과 캐스팅이 발생한다.

 


 

 

정리

  • 2의 거듭제곱을 표현할 때 1 << n이 더 적절하다.
  • 정수 연산이며, 비트마스크 문제와 의미적으로 잘 맞는다.
  • Math.Pow는 부동소수점 연산이므로 이런 상황에서는 피하는 것이 좋다.

관련글 더보기