CC++ & Algorithm

十进制转二进制:手把手教你用C++实现

困难20
语言版本:C++Python
概述:学会“除2取余”法,再写成C++代码,就能轻松把十进制数变成二进制。

十进制转二进制:用“除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为例):

  1. 6 ÷ 2 = 3 余数 0(剩下0颗糖,装了一盒3颗?不对,是每次除以2,余数就是二进制的一位)
  2. 3 ÷ 2 = 1 余数 1
  3. 1 ÷ 2 = 0 余数 1
  4. 商变成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取余(余数1015用AF表示)。
  • C++中的bitset:标准库提供的一个工具,可以快速把整数转成二进制字符串,比如 bitset<8>(6).to_string() 会得到 "00000110"。虽然方便,但手动实现更能理解原理。

记住,计算机里所有的数据最终都是二进制,掌握了它,你就拿到了理解计算机世界的钥匙。试着输入不同的数字(比如100、255),看看它们的二进制是什么样吧!

例题精讲

1单选题

将十进制数 13 转换为二进制,结果是?

A1101
B1011
C1110
D1001
2判断题

在C++中,使用除2取余法将十进制正整数转换为二进制时,每次除2得到的余数需要按照从后往前(逆序)排列才能得到正确的二进制数。

3填空题
以下C++函数将十进制整数num(正整数)转换为二进制字符串。请补全代码。

string decToBinary(int num) {
    string bin = "";
    while (num > 0) {
        int rem = num % 2;
        bin = ___ + bin;
        num /= 2;
    }
    return bin;
}
4单选题

执行下面C++代码段后,变量bin的值是什么? int num = 6; string bin = ""; while (num > 0) { bin = char('0' + num % 2) + bin; num /= 2; } cout << bin;

A"110"
B"011"
C"101"
D"111"
5判断题

在C++中,如果一个十进制正整数小于2,那么它转换为二进制后只有一位,即该数字本身(0或1)。