LeeCode_693. 交替位二进制数

693. 交替位二进制数

给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

示例 1:

输入:n = 5
输出:true
解释:5 的二进制表示是:101

  • 法一:只要有前后为相同的情况就返回false
class Solution {
public:
    bool hasAlternatingBits(int n) {

        while (n) {
            int cur1 = n & 1;
            n >>= 1;
            int cur2 = n & 1;
            if (cur1 == cur2) 
            {
                return false;
            }
        }
        return true;
    }
};
  • 法二:位运算,利用交替位二进制数性质;假设将 n 右移一位得到的值仍

为交替位二进制数,且与原数 n 错开一位,两者异或能够得到形如

0000...1111的结果 x,此时对 x 执行加法(进位操作)能够得到形如

0000...10000的结果,将该结果与 x 执行按位与后能够得到全 0 结果。

如果是去全零,则返回 true,否则返回 false。

  • 值得注意的是x加一后可能溢出:
  • 边界陷阱

假设输入是 32 位整数的最大交替值 1431655765(二进制 01010101...0101)。

x 会变成 00101010...1010,这没问题。

但如果 n 的最高位是 1(比如 1010...),那么 x 的最高位也是 1(1111...)。

此时 x + 1 会变成 10000...0(第 33 位变 1)。

如果是 int 类型,x + 1 会发生整数溢出,导致结果错误。

使用 long(64位整数)可以容纳这个进位,确保逻辑正确

class Solution {
public:
    bool hasAlternatingBits(int n) {
        long x = n ^ (n >> 1);
        return (x & (x + 1)) == 0;
    }
};
posted @ 2026-01-17 22:43  Jaylan  阅读(1)  评论(0)    收藏  举报