题目描述
解法:
当给定值 n n n 为交替位二进制数时,将 n n n 右移一位得到的值 m m m 仍为交替位二进制数,且与原数 n n n 错开一位,两者异或能够得到形如 0000...1111 0000...1111 0000...1111 的结果 a a a,此时对 a a a 执行加法(进位操作)能够得到形如 0000...10000 0000...10000 0000...10000 的结果,将该结果与 a a a 执行按位与后能够得到全 0 0 0 结果
举个例子一看就懂, 1010 1010 1010 右移一位得到 0101 0101 0101,两者异或后的结果是 a = 1111 a = 1111 a=1111, 1111 1111 1111 加一得到 10000 10000 10000, ( 0 ) 1111 (0) 1111 (0)1111 与 10000 10000 10000 与之后结果为 000000 000000 000000
class Solution {
public:
bool hasAlternatingBits(int n) {
long a = n ^ (n >> 1);
return (a & (a + 1)) == 0;
}
};