慕碼人8056858
2019-06-25 15:56:13
如何檢查一個數字是否為2的冪今天,我需要一個簡單的算法來檢查一個數字是否是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;}但后來我想,檢查一下log2 x是正整數嗎?但當我檢查2^63+1時,Math.Log因為四舍五入返回了63。因此,我檢查了冪63的2是否等于原來的數字-是的,因為計算是在doubles而不是確切的數字: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.有更好的算法嗎?
3 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
bool IsPowerOfTwo(ulong x){ return (x & (x - 1)) == 0;}
true
0
2
bool IsPowerOfTwo(ulong x){ return (x != 0) && ((x & (x - 1)) == 0);}
解釋
二進制&運算符是為積分類型和bool預定義的。對于整型,計算邏輯位數及其操作數。對于bool操作數,&計算邏輯和它的操作數;也就是說,結果是真的當且僅當它的兩個操作數都是真的。
bool b = IsPowerOfTwo(4)
return (4 != 0) && ((4 & (4-1)) == 0);
((4 & (4-1)) == 0)
((4 & 3) == 0)
4&3
?
100 = 4011 = 3
&
1 & 1 = 1
, 1 & 0 = 0
, 0 & 0 = 0
0 & 1 = 0
100011----000
return (4 != 0) && ((4 & 3) == 0);
return true && (0 == 0);
return true && true;
true && true
true
添加回答
舉報
0/150
提交
取消