如何检查一个数字是否为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
提交
取消