在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案:
1. 做位移操作
2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同
对于方案1,我的想法是对数值 n 先做一次右移的移位操作,然后在对右移后的数做左移操作,判断两次操作前后的数值是否相同,以下是代码:
1 public boolean isPowerOfTwo(int n) { 2 3 for(int i=0;i<32;i++){ 4 int temp = n >> i; 5 int large = temp << i; 6 if(n != large){ 7 return false; 8 } 9 if(temp == 1){ 10 return true; 11 } 12 } 13 return false; 14 }
对于方案2,就很简单了,做与操作就可以了,由于计算机中负数的二进制表示是先对正数按位取反,然后再加1实现的,所以对于 n & -n 如果n是2的幂,二进制表示中只有一位为1,设位置为k,-n 这是从低位开始,直到k之前的都是0,k之后的都为1,与操作后还是 n
1 public boolean isPowerOfTwo2(int n){ 2 3 return (n > 0) && ((n & (-n)) == n); 4 }