Alt经典按位回答2 ^ n测试:有效吗?

时间:2014-04-21 18:32:03

标签: bit-manipulation

快速提问:我提出了单行表达式来测试n格式为2 ^ n(n> = 0)。

请参阅:http://www.exploringbinary.com/ten-ways-to-check-if-an-integer-is-a-power-of-two-in-c/

一位同事想出了这个非正统的答案:

((n-1) xor n == 2*n - 1) && (n != 0)

我构建了一个测试工具来检查它,看起来是正确的。我测试了大约。 N = 10000。

是否有人发现此解决方案存在问题?我无法在网上找到它的参考。

谢谢!

-David

1 个答案:

答案 0 :(得分:2)

您应该测试所有输入(例如使用SMT解算器)。

有31个案例,即使n不是2的幂,这个公式也是真的。除了其他位之外,它们是设置最高位的情况。例如,0xC0000000或0x80000001。

n ^ (n - 1)是一种已知的方法,可以提取最右边的设置位并将其涂抹到右侧"。在我描述的情况下,n * 2 - 1意外地相同,高位被移出并且-1将最右边的位涂抹到右边(因为该位现在是以前的位置的一个位置)。