오늘 저는 숫자가 2의 거듭 제곱인지 확인하는 간단한 알고리즘이 필요했습니다.
알고리즘은 다음과 같아야합니다.
- 단순한
- 모든
ulong
값을 정정하십시오 .
이 간단한 알고리즘을 생각해 냈습니다.
private bool IsPowerOfTwo(ulong number)
{
if (number == 0)
return false;
for (ulong power = 1; power > 0; power = power << 1)
{
// This for loop used shifting for powers of 2, meaning
// that the value will become 0 after the last shift
// (from binary 1000...0000 to 0000...0000) then, the 'for'
// loop will break out.
if (power == number)
return true;
if (power > number)
return false;
}
return false;
}
그러나 나는 정확히 둥근 숫자인지 확인하는 방법에 대해 생각했습니다 . 그러나 2 ^ 63 + 1을 확인하면 반올림으로 인해 정확히 63을 반환했습니다. 따라서 2의 거듭 제곱 63이 원래 숫자와 같은지 확인했습니다. 계산은 정확한 숫자가 아닌 s 로 수행되기 때문 입니다.log2 x
Math.Log
double
private bool IsPowerOfTwo_2(ulong number)
{
double log = Math.Log(number, 2);
double pow = Math.Pow(2, Math.Round(log));
return pow == number;
}
true
주어진 잘못된 값으로 돌아 왔습니다 : 9223372036854775809
.
더 나은 알고리즘이 있습니까?
(x & (x - 1))
이면 솔루션에서 오 탐지를 반환 할 수 있다고 생각합니다 .X
8 + 16