原题
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。传送链接
思路
我一开始的思路便是将这个正整数转化为二进制,不断除以2.判断余数(即为二进制中的一个bit, 是否和之前一样,思路比较直接
class Solution {
public:
bool hasAlternatingBits(int n) {
int r = -1;
while(n){
int a = n % 2;
// cout<<n<<" "<<r<<endl;
if(r == a) return false;
r = a;
n /= 2;
}
return true;
}
};
题解的思路更为巧妙,一般题目涉及到二进制,一般的运算符,比如 and,or, xor,左移,右移都是经常要用到的。
我们举个例子,比如101010这个数,判断它是否符合交替的条件的话,我们先将这个数字右移,也就是变成010101,那么我们把它异或起来,那么结果就是111111,
到这里我们可以直接判断它每个bit都是1,但是我们也有更巧妙的方法,就是将这个数+1,那么就变成了1000000,将这个数和111111并起来不就是0了吗,所以有
class Solution {
public:
bool hasAlternatingBits(int n) {
long a = n ^ (n >> 1);
return (a & (a + 1)) == 0;
}
};