循环退出后vector数据丢失:十进制转二进制函数调用后容器为空
问题分析与修复
你的代码存在三个核心问题,导致vector为空或结果错误:
- 循环条件错误:
while (decimalNumber != 0)会触发两个严重问题:一是当decimalNumber提前减至0时,后续二进制位不会补0;二是divisor最终会被除至0,触发除零异常,程序直接崩溃,导致vector无法正常填充。 - 判断逻辑遗漏:
if (decimalNumber > divisor)没有处理decimalNumber == divisor的情况,会导致decimalNumber无法正确递减,进而生成错误的二进制位。 - 位值计算逻辑不安全:用
decimalNumber/divisor获取位值,当decimalNumber是divisor的多倍时(虽然你限定小于256,但逻辑上仍有风险),会得到大于1的结果,不符合二进制位只能是0/1的要求。
修复后的代码
#include <vector> #include <iostream> using namespace std; void convertToBinary(short decimalNumber, vector<short> &binaryNumber) { short divisor = 128; // 固定循环8次,生成完整的8位二进制数(对应小于256的十进制数) for (int i = 0; i < 8; ++i) { if (decimalNumber >= divisor) { binaryNumber.push_back(1); decimalNumber -= divisor; } else { binaryNumber.push_back(0); } divisor /= 2; } } int main() { short decimalNumber = 231; vector<short> binaryNumber; convertToBinary(decimalNumber, binaryNumber); for (int bit : binaryNumber) { cout << bit; } // 输出应为:11100111 return 0; }
修复说明
- 改用
for循环遍历8次:确保生成完整的8位二进制结果,不会因为decimalNumber提前变为0而停止。 - 直接通过
>=判断位值:避免除法操作,确保每一位只能是0或1,同时正确处理等于divisor的情况。 - 移除错误的除法位值计算:通过条件判断直接生成0/1,逻辑更清晰且安全。
内容的提问来源于stack exchange,提问作者Halty
相关产品推荐
相关产品推荐

