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;
}
};