如何判断一个数是否为2的幂
题目
给定一个整数,写一个函数判断该函数是否为2的幂。
例如
输入 16
输出 true
输入:5
输出:false
code1
bool isPowerOfTwo(int n){
long x;
x=n;
if(n==0)
return false;
return (x &(x-1) )==0;
}
code2
bool isPowerOfTwo(int n){
long x;
x=n;
if(n==0)
return false;
return (x &(-x) )==x;
}
思路
由二进制原理可以知道,如果一个数为2的幂,那么这个数对应的二进制应该只有一个1,
算法1:
在计算机系统中负数通常以补码的方式存储,
7的8位二进制为
0000_0111
-7的8位二进制为
1111_1001
7&(-7)的二进制为 0000_00014的8位二进制为
0000_0100
-4的8位二进制为
1111_1100
4 &(-4)的二进制位0000_0100
因此 x &(-x)将x的最右边置为1,由于如果一个数为2的幂,该数字对应的二进制只有一个1,因此可得
x&(-x) = x
该思路对应code2
算法2:
依然从由于如果一个数为2的幂,该数字对应的二进制只有一个1考虑,那么可以得到
x&(x-1) = 0
例如4对应的二进制为
0000_0100
4-1对应的二进制为
0000_0011
4 & (4-1)==07对应的二进制为
0000_0111
7-1对应的二进制位
0000_0110
7 & (7-1) != 0
该思路对应code1