693. 交替位二进制数(简单)

 
 
方法一
思路
-  
如果一个数的二进制表示总是 0、1 交替出现,那么这个数字可能有两种表示情况,
...101010或...010101,即对应最低位从 0 或 1 开始的两种情况。 -  
因此,我们先确定该二进制的最低位:
begin = n & 1,接下来遍历 n 的每一位,并且与应出现的最低位进行比较。比方说,一开始begin 是 1 ,那么接下来应该要出现 0,所以我们将 begin 更新为 0,然后将它和 n 的最低位比较,如果相同说明可以判断下一位,如果不同,则说明这个数字不是交替位二进制数,直接返回 false。
 
代码
class Solution {
public:
    bool hasAlternatingBits(int n) {
        int begin = n & 1; 
        while(n){
            if((n & 1) == begin){
                begin = (begin + 1) % 2;
                n >>= 1;
            }
            else{
                return false;
            }
        }
        return true;
    }
};
 
方法二
思路
-  
对输入 n 的二进制表示右移一位后,得到的数字再与 n 按位异或得到 tmp 。当且仅当输入n为交替位二进制数时,tmp 的二进制表示全为1 (不包括前导0)。
 -  
将 tmp 与 tmp +1 按位与,当且仅当 tmp 的二进制表示全为1 时,结果为0。这里进行简单证明:当且仅当 tmp 的二进制表示全为 1 时,tmp +1 可以进位,并将原最高位置为 0,按位与的结果为0。否则,不会产生进位,两个最高位都为1,相与结果不为0
 -  
结合上述两步,可以判断输入是否为交替位二进制数。
 
代码
class Solution {
public:
    bool hasAlternatingBits(int n) {
        long tmp = n ^ (n >> 1);
        return (tmp & (tmp+1)) == 0;
    }
};
                


















