블로그 옮겼습니다
2의 거듭제곱인지 O(1)에 판별하는 방법 본문
1 2 | if(n == (n&-n)) printf("2의 거듭제곱!"); else printf("2의 거듭제곱 아님!"); | cs |
이유를 설명하자면 2의 거듭제곱은 어떤 한 비트만 켜져있을 것이다.
n & -n 은 n에서 켜져있는 가장 아래의 비트만 켜진 수이다.
그렇기 때문에 2개 이상이 켜져있다면 n & -n와는 절대 같아질 수 없는 것이다.
그리고 n에 비트가 하나만 켜져있다면 n & -n 은 그 비트만 켜진 수가 되므로 같게되는것이다.
+그리고 & 연산자보다 == 연산자가 더 우선순위가 높으므로 괄호를 감싸는것을 잊으면 큰일난다..
'Algorithm > Memo &Tips' 카테고리의 다른 글
중복없이 서로 다른 답들의 수를 세는 방법 (0) | 2017.05.19 |
---|---|
C++ 에서 문자열 파싱하기 (0) | 2017.05.18 |
K번째 원소구하기 (1) | 2017.05.09 |
벡터 배열 각각 정렬 + 사전순 정렬 (0) | 2017.05.07 |
그래프에서 노드의 Degree에 대한 성질 (0) | 2017.05.06 |
Comments