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作为数组长度即可。 - 相邻位判断逻辑错误:
- 循环条件
i < arrSize会导致访问a[i+1]时数组越界,应该改为循环到实际长度减1的位置 - 你现在的逻辑是每对比一对相邻位就输出一次结果,正确逻辑应该是只要找到一对相等的相邻位,就直接输出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
相关产品推荐
相关产品推荐

