주어지는 숫자 n이 2의 제곱으로 나타낼 수 있는지를 확인하는 것이다. 나타낼 수 있다면 true 없다면 false를 return 해주면 된다.
나의 코드는 n이 1일 때는 2의 0승 이므로 그냥 true를 반환하게 했다.
그 이후로는 result를 2씩 곱해서 n과 같아지면 true를 리턴 하고 더 커질 경우에 false를 출력하게 했다.
const isPowerOfTwo = function (n) {
if (n === 1) return true;
let result = 1;
while (true) {
result *= 2;
if (result === n) return true;
else if (result > n) return false;
}
};
하지만 이 코드는 단순 노가다일 뿐이라는 것을 다른 사람의 코드를 보고 알았다.
n이 1보다 작으면 바로 false를 리턴하게 했다.
그리고 n과 n -1 을 비트연산 &을 써서 0 이면 true 아니면 false를 return 하게 한다.
그 이유는 n 이 2의 배수라면 1, 10, 100, 1000 과 같이 맨 앞자리 빼고 0을 가지게 된다. 그것의 -1 한 값은 0, 01, 011, 0111 과 같이 맨 앞자리 빼고 다 1이 된다. 어느 것도 1, 1 이 없기 때문에 0이 된다. 그래서 n 과 n - 1을 & 비트연산 했을 때 0이 나오면 n은 2의 제곱 수라고 할 수 있다.
const isPowerOfTwo1 = function (n) {
if (n < 1) {
return false;
}
return (n & (n - 1)) === 0;
};