LeetCode 腾讯精选50题--2的幂

在二进制中,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     }
原文地址:https://www.cnblogs.com/Kaithy-Rookie/p/11341866.html