You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++判断数字二进制无连续相同位代码输出错误如何排查

问题分析

你的代码存在以下几处核心错误,导致运行结果不符合预期:

  • 动态数组分配逻辑错误:int* a = new int[n]; 中参数n是输入的原始数值,不是二进制位的长度,虽然实际运行中不会立刻报错,但属于逻辑冗余,无符号数的二进制最多只有32/64位,完全不需要开这么大的空间。
  • 数组长度计算完全错误:int arrSize = sizeof(a) / sizeof(a[0]); 中的a是指针类型,sizeof(a)获取的是指针本身的内存大小(32位系统为4字节、64位系统为8字节),和数组实际存储的二进制位数量完全无关。你之前将二进制位存入数组的循环中,变量i已经记录了实际的二进制位数,直接使用i作为数组长度即可。
  • 相邻位判断逻辑错误:
    1. 循环条件i < arrSize会导致访问a[i+1]时数组越界,应该改为循环到实际长度减1的位置
    2. 你现在的逻辑是每对比一对相邻位就输出一次结果,正确逻辑应该是只要找到一对相等的相邻位,就直接输出false并终止判断,所有相邻位都对比完没有相等的情况,才输出true。
  • 输入参数类型不匹配:main函数中定义的n是int带符号类型,传入的函数参数是unsigned无符号类型,输入负数时会出现类型转换异常。
修正后的完整代码
#include <iostream>
using namespace std;

void hasAlternatingBits(unsigned n) {
    // 无符号整数最多32位,固定长度数组足够使用
    int a[32];
    int bitCount = 0;
    // 存储二进制位
    for (bitCount = 0; n > 0; bitCount++)
    {
        a[bitCount] = n % 2;
        n = n / 2;
    }
    // 遍历对比相邻位
    for (int i = 0; i < bitCount - 1; i++) {
        if (a[i] == a[i + 1]) {
            cout << "false";
            return;
        }
    }
    // 所有相邻位都不相等才输出true
    cout << "true";
}

int main() {
    unsigned n;
    cin >> n;
    hasAlternatingBits(n);
    return 0;
}
优化方案(无需额外数组)

可以直接通过位运算实现判断,性能更高、代码更简洁:

#include <iostream>
using namespace std;

bool hasAlternatingBits(unsigned n) {
    unsigned x = n ^ (n >> 1);
    return (x & (x + 1)) == 0;
}

int main() {
    unsigned n;
    cin >> n;
    cout << (hasAlternatingBits(n) ? "true" : "false");
    return 0;
}

原理:如果二进制位没有连续相等的位,n右移一位后和原数异或得到的结果所有位都是1,加1之后和原数按位与的结果就是0。

内容的提问来源于stack exchange,提问作者tupkon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:24:03