快速提问:我提出了单行表达式来测试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
答案 0 :(得分:2)
您应该测试所有输入(例如使用SMT解算器)。
有31个案例,即使n
不是2的幂,这个公式也是真的。除了其他位之外,它们是设置最高位的情况。例如,0xC0000000或0x80000001。
n ^ (n - 1)
是一种已知的方法,可以提取最右边的设置位并将其涂抹到右侧"。在我描述的情况下,n * 2 - 1
意外地相同,高位被移出并且-1将最右边的位涂抹到右边(因为该位现在是以前的位置的一个位置)。