十进制转二进制:手把手教你用C++实现
困难20十进制转二进制:用“除2取余”法,轻松用C++搞定
你有没有想过,你在游戏里攒的100颗钻石、考试得到的98分,在电脑里其实是一长串像“1100010”这样的0和1?没错,计算机只认识二进制——由0和1组成的数字系统。因为计算机用电路的开和关(通和断)来表示状态,开就是1,关就是0。所以,不管是我们输入的数字、文字还是图片,最终都会变成二进制,才能被计算机处理。
那么,如何把一个我们熟悉的十进制数(比如6)变成二进制呢?最经典的**“除2取余”法**就能搞定。这篇文章就带你一步步拆解,然后用C++代码把它写出来。
1. 什么是二进制?一分钟搞懂
我们平时用的十进制,有0~9共10个数字,规则是“逢十进一”。比如9加1,个位变成0,十位进1,得到10。
而二进制只有0和1两个数字,规则是“逢二进一”。所以二进制里只有0、1、10(读作“一零”,是十进制2)、11(十进制3)、100(十进制4)……
举个例子:
十进制数 5 = 二进制 101
十进制数 6 = 二进制 110
十进制数 7 = 二进制 111
十进制数 8 = 二进制 1000
2. “除2取余”法:分糖果般的简单
想象一下,你有一把糖果,想把它装进盒子里,每盒放2颗,装满一盒就封好,剩下的糖果放一边。最后,把每盒剩下的糖果按照倒序写出来,就是二进制啦!
具体步骤(以十进制6为例):
- 6 ÷ 2 = 3 余数 0(剩下0颗糖,装了一盒3颗?不对,是每次除以2,余数就是二进制的一位)
- 3 ÷ 2 = 1 余数 1
- 1 ÷ 2 = 0 余数 1
- 商变成0了,停止。
然后,把余数从下往上读:1 → 1 → 0,得到 110。所以 6 的二进制就是 110。
这个“从下往上”非常重要,因为第一次除得到的余数是最低位(最右边),最后一次的余数是最高位(最左边)。如果从上往下读,就反了。
3. 用C++实现:两种思路任你选
思路1:用数组存余数,最后反转(直观但稍麻烦)
#include <iostream>
using namespace std;
int main() {
int num; // 用户输入的十进制数
cout << "请输入一个十进制整数: ";
cin >> num;
int temp = num; // 临时变量,避免破坏原数
int binary[32]; // 数组存余数,int型最长32位
int index = 0; // 记录余数个数
while (temp > 0) {
int remainder = temp % 2; // 取出余数(0或1)
binary[index] = remainder; // 放入数组
index++;
temp = temp / 2; // 更新商
}
cout << "二进制: ";
// 从后往前输出(反转)
for (int i = index - 1; i >= 0; i--) {
cout << binary[i];
}
cout << endl;
return 0;
}
这种方法把余数按顺序放进数组(低位在前),然后从后往前打印,就实现了“从下往上读”。
思路2:用字符串直接拼,省去反转(更聪明,推荐)
C++的string可以在字符串前面加字符,这样每次把新得到的余数加到字符串的最前面,就自动实现了“从下往上”。代码更简洁,是学习的好例子。
#include <iostream>
#include <string> // 使用string类型
using namespace std;
string decimalToBinary(int n) {
if (n == 0) return "0"; // 特殊情况:0的二进制是"0"
string bin = ""; // 用来存放二进制结果字符串
while (n > 0) {
int remainder = n % 2; // 取余数(0或1)
// 把数字变成字符,例如0变成'0',1变成'1'
char bit = char('0' + remainder);
bin = bit + bin; // 把新位加到字符串最前面
n = n / 2; // 更新商
}
return bin;
}
int main() {
int num; // 用户输入的十进制数
cout << "请输入一个十进制整数: ";
cin >> num;
cout << "二进制: " << decimalToBinary(num) << endl;
return 0;
}
运行示例:
请输入一个十进制整数: 6
二进制: 110
如果你输入 0,会直接返回 "0",否则程序会正确转换。
? 小知识:
char('0' + remainder)是利用了ASCII编码:字符'0'的ASCII码是48,加上0还是48(即'0'),加上1变成49(即'1')。这样数字0和1就变成了字符 '0' 和 '1'。
4. 新手常犯的4个错误
❌ 错误1:忘记处理 n = 0 的情况
如果输入0,循环 while (n > 0) 根本不执行,直接返回空字符串。所以要加 if (n == 0) return "0";
❌ 错误2:把余数往字符串末尾追加,而不是前面
bin = bin + bit; // 这是错误的!会把低位放在最左边
结果:6变成 "011"(应该是"110"),完全反了。
❌ 错误3:循环条件写成 while (n >= 0) 或 while (n != 0)
while (n >= 0) 会导致死循环,因为除以2后永远不会小于0。用 while (n > 0) 就对了。
❌ 错误4:把商和余数搞混
注意 n % 2 得到的是余数,n / 2 得到的是新的商。顺序不能颠倒,否则程序会乱。
5. 完整可运行的“调试版”代码
下面的代码不仅输出结果,还会把每一步的商和余数打印出来,帮你直观理解计算过程。
#include <iostream>
#include <string>
using namespace std;
string decimalToBinaryDebug(int n) {
if (n == 0) {
cout << "0直接得到0" << endl;
return "0";
}
string bin = "";
int count = 1; // 记录当前是第几步
while (n > 0) {
int remainder = n % 2; // 取余数
cout << "第" << count << "步: " << n << " ÷ 2 = " << (n / 2)
<< " 余 " << remainder << endl;
char bit = char('0' + remainder);
bin = bit + bin; // 加到前面
n = n / 2;
count++;
}
cout << "余数从下往上读: " << bin << endl;
return bin;
}
int main() {
int num; // 输入的十进制数
cout << "请输入一个十进制整数: ";
cin >> num;
string result = decimalToBinaryDebug(num);
cout << "二进制结果: " << result << endl;
return 0;
}
运行示例(输入6):
请输入一个十进制整数: 6
第1步: 6 ÷ 2 = 3 余 0
第2步: 3 ÷ 2 = 1 余 1
第3步: 1 ÷ 2 = 0 余 1
余数从下往上读: 110
二进制结果: 110
6. 继续探索
学会了十进制转二进制,你可以去学习:
- 二进制转十进制:把每一位乘以2的次方,再相加。比如110 = 1×4 + 1×2 + 0×1 = 6。
- 十进制转八进制、十六进制:思路一样,只是除的数字不同:八进制除8取余,十六进制除16取余(余数10
15用AF表示)。 - C++中的
bitset:标准库提供的一个工具,可以快速把整数转成二进制字符串,比如bitset<8>(6).to_string()会得到"00000110"。虽然方便,但手动实现更能理解原理。
记住,计算机里所有的数据最终都是二进制,掌握了它,你就拿到了理解计算机世界的钥匙。试着输入不同的数字(比如100、255),看看它们的二进制是什么样吧!
例题精讲
将十进制数 13 转换为二进制,结果是?
在C++中,使用除2取余法将十进制正整数转换为二进制时,每次除2得到的余数需要按照从后往前(逆序)排列才能得到正确的二进制数。
以下C++函数将十进制整数num(正整数)转换为二进制字符串。请补全代码。
string decToBinary(int num) {
string bin = "";
while (num > 0) {
int rem = num % 2;
bin = ___ + bin;
num /= 2;
}
return bin;
}执行下面C++代码段后,变量bin的值是什么? int num = 6; string bin = ""; while (num > 0) { bin = char('0' + num % 2) + bin; num /= 2; } cout << bin;
在C++中,如果一个十进制正整数小于2,那么它转换为二进制后只有一位,即该数字本身(0或1)。