숫자를 입력받아 해당 숫자가 2의 거듭제곱인지 여부를 판별하는 자바스크립트 함수를 작성해야 합니다.
예시 −
f(23) = false f(16) = true f(1) = true f(1024) = true
접근 방법
2의 거듭제곱 수를 이진수로 표현하면 항상 단 하나의 비트만 1로 설정되어 있다는 특징이 있습니다.
1: 0001 2: 0010 4: 0100 8: 1000
따라서 먼저 숫자가 0보다 큰지 확인한 후, 비트 연산 트릭을 활용해 딱 하나의 비트만 켜져 있는지 검사할 수 있습니다.
num & (num - 1)
이 연산의 원리는 다음과 같습니다. 2의 거듭제곱에서 1을 빼면 설정된 비트 아래의 모든 비트가 1로 바뀌므로, 원래 값과 AND(&) 연산을 하면 결과가 반드시 0이 됩니다. 만약 2의 거듭제곱이 아니라면 두 개 이상의 비트가 남아 결과가 0이 되지 않습니다.
예제 코드
다음은 전체 구현 코드입니다 −
const num1 = 256;
const num2 = 1024;
const isPowerOfTwo = (num = 1) => {
if (num < 1) {
return false;
};
return (num & (num - 1)) === 0;
};
console.log(isPowerOfTwo(num1));
console.log(isPowerOfTwo(num2));
console.log(isPowerOfTwo(1));
console.log(isPowerOfTwo(23));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
true true true false