C++实现十进制整数转二进制:处理负数与格式化输出
本教程介绍在C++中将十进制整数(包括负数)转换为二进制表示的方法,重点解决如何保留负号并按指定宽度(如11位)右对齐输出的问题。
实现逻辑与核心步骤
将十进制数转换为二进制的核心在于“除2取余法”。对于每个整数,持续对其除以2并记录余数,直到商为0为止。由于得到的二进制序列是低位在前、高位在后(反向),需要将其反转才能成为正确的二进制字符串。
第一步:处理零值特殊情况
C++的while循环条件n!=0会自动跳过零值的处理,因此需要先单独判断。若输入为0,直接输出对应的二进制字符串"0"即可,无需进入循环。
第二步:循环取余构建二进制串
使用一个临时变量保存当前数值,循环中通过a % 2判断奇偶性来确定当前位的值是'1'还是'0',并将其追加到结果字符串中。随后通过a = a / 2缩小数值进行下一轮计算。
代码如下:
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
string resultStr;
int main() {
int n;
while(cin >> n) {
// ... (后续代码见完整实现)
}
return 0;
}
第三步:反转字符串
上述步骤拼接出的字符串是逆序的。调用<algorithm>头文件中的reverse()函数,对字符串的首尾指针进行逆置操作,即可得到正确的二进制序列。
第四步:负数符号分离与格式化输出
二进制通常以正数形式呈现,负号需单独处理。判断原数是否小于0,若小于0则在中间插入"-"。
为了满足“以11位的宽度右对齐”的要求,使用cout.width(11)设置下一个字段的输出宽度,再依次输出原数、连接符和二进制字符串。
完整可运行代码示例
以下代码整合了上述所有步骤,能够处理不超过50个整数的批量输入,并严格遵循指定的格式输出:
复制代码
#include
#include
#include
#include
using namespace std;
string s;
int main() {
int n;
while(cin >> n) {
if(n == 0) {
// 特殊处理0:前导空格+0 + -->0
cout << " 0-->0\n";
continue;
}
// 初始化空串
s = " ";
// 核心转换逻辑:除2取余
int tempN = (n < 0 ? -n : n); // 暂时转为绝对值处理
for(int a = tempN; a; a = a / 2) {
s = s + (a % 2 ? '1' : '0');
}
// 逆置得到正确顺序的二进制串
reverse(s.begin(), s.end());
const char *sss = s.c_str();
// 格式化输出:11位右对齐 + 分隔符 + 二进制串
// 注意:负数需在二进制前加'-',且不占位
if (n < 0) {
cout.width(11);
cout << n << "-->-" << sss << "\n";
} else {
cout.width(11);
cout << n << "-->" << sss << "\n";
}
}
return 0;
}
运行效果验证
按照题目要求的格式,输入不同数值后,程序会在终端产生如下对齐效果的输出:
总结
以上就是C++处理十进制转二进制及格式化输出的详细内容。该实现利用了标准库的reverse功能简化了位运算的逻辑复杂度,非常适合用于理解基础的进制转换算法与控制台输出格式化技巧。更多关于C++底层原理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









