어떤 정수 n이 주어졌을때, n보다 작거나 같으면서 가장 가까운 2의 거듭제곱이 필요할때가 있다
구체적으로 $2^{x} = n$을 만족하는 정수 x를 찾고 싶을 때가 있다.
제일 쉬운 방법은?
import math
n = int(input())
print(int(math.log2(n)))
근데 얘는 문제가 n이 엄청 크면 실수오차 발생으로 틀릴 수 있다는거
이를 피하는 방법은 2씩 직접 곱해서 찾는 방법이 있고
import math
n = int(input())
x = 0
v = 1
while v < n:
v *= 2
if v > n:
break
x += 1
print(x)
그런데 이 방법은 O(logN)이다.
메소드 중에 bit_length()라는 메소드가 있다
어떤 정수를 이진수로 표현할때 그 이진수의 비트 수를 반환함
예를 들어 10 = 1010(2)니까 10의 bit_length()값은 4이다

int(math.log2(n))은 무엇을 의미하는가?
$2^{x} <= n$을 만족하는 가장 큰 정수 x이다.
즉, n을 이진수로 나타낼때, n의 최상위 비트를 나타내는 것으로, n의 비트 길이 - 1과 같다.
n = int(input())
print(n.bit_length()-1)
항상 정확하게 O(1)에 계산하며, 보통은 math.log2보다 훨씬 빠르다.
728x90
'알고리즘 > 비트마스킹' 카테고리의 다른 글
| 이진수에서 1의 개수를 세는 Kernighan’s Algorithm과 bit_count() (0) | 2025.02.02 |
|---|---|
| 합과 bitwise or연산이 같게되는 조건 (0) | 2025.01.09 |
| 이진수의 마지막 n개의 비트가 모두 켜져있는지 확인하는 방법 (0) | 2024.05.03 |
| 비트마스크를 이용한 에라토스테네스의 체 배우기 (0) | 2023.05.04 |
| 정수 n을 2의 거듭제곱으로 나눈 나머지를 효율적으로 구하는 방법 (0) | 2023.05.03 |
