숫자 n이 있다고 가정합니다. 숫자가 2의 거듭제곱인지 아닌지 확인해야 합니다. 따라서 n =16이면 출력이 참이 되고 n =12이면 거짓이 됩니다.
이를 해결하기 위해 논리 연산을 사용합니다. 2의 거듭제곱인 숫자가 표시되면 해당 숫자의 이진 표현에서 MSb는 1이고 다른 모든 비트는 0입니다. 따라서 [n AND (n – 1)]을 수행하면 다음이 반환됩니다. n이 2의 거듭제곱이면 0입니다. 이진수로 n =16 =10000, 이진수로 (n – 1) =15 =01111이면 10000 AND 01111 =00000 =0
예시(다)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <stdio.h> #include <math.h> #define MAX 20 bool isPowerOfTwo(int n){ return(n>0 && !(n & (n-1))); } int main() { printf("%s\n", isPowerOfTwo(16) ? "true" : "false"); printf("%s\n", isPowerOfTwo(12) ? "true" : "false"); printf("%s\n", isPowerOfTwo(1) ? "true" : "false"); printf("%s\n", isPowerOfTwo(32) ? "true" : "false"); printf("\n"); }
입력
16 12 1 32
출력
true false true true