问题来源:Power of Two
即判断一个整数是否为2的幂,注意这里的整数有可能是负整数,某些针对正整数的算法并不适用。以下是几种通过了测试的代码(C语言)以及在leetcode上测试1108个用例花费的时间。
- 除法
不断对输入的整数做除法,如果最后的商是1,那么这个整数是2的幂;如果商在变为1之前已经是一个奇数(如7/2为3),那么这个整数不是2的幂。代码如下:
bool isPowerOfTwo(int n) {
while ((n % 2 == 0) && n > 1)
n /= 2;
return (n == 1);
}
耗时4ms。 - 右移
这种算法和除法是相等的,除以2实际上相当于右移 1 bit,检查一个二进制数是否为奇数和检查它的最后一位是否为 1 相同。代码如下:
bool isPowerOfTwo(int n) {
while (((n & 1) == 0) && n > 1) /* While n is even and > 1 /
n >>= 1;
return (n == 1);
}
耗时同样为4ms。
3.数“1”
这种想法最为自然,因为2的幂表示为二进制都是1后面加上相应数量的0(如32的二进制表示为100000),如果二进制里出现了多于一个的“1”这个整数一定不是2的幂。代码如下:
bool isPowerOfTwo(int x) {
unsigned int numberOfOneBits = 0;
while(x && numberOfOneBits <=1)
{
if ((x & 1) == 1) / Is the least significant bit a 1? /
numberOfOneBits++;
x >>= 1; / Shift number one bit to the right /
}
return (numberOfOneBits == 1); / 'True' if only one 1 bit */
}
耗时8ms。
参考资料:Ten Ways to Check if an Integer Is a Power Of Two in C