CC++ & Algorithm

十进制转换成二进制

中等5
语言版本:C++Python
概述:学习手动“除2取余”法,并用Python的`bin()`函数快速转换。

十进制转二进制:从手工到Python

计算机里所有的数据最终都是用二进制的0和1来存储的,就像开关只有“开”和“关”一样。而我们平时用的数是十进制(0~9)。把十进制数转成二进制,能帮你理解计算机的“语言”。本文会教两种方法:一种是你用纸笔就能算的“除2取余法”,另一种是直接用Python的bin()函数,最后还会教你写一个自己的转换函数。


1. 手工转换:除2取余法

这个方法就像分糖果:每次把总数除以2,看看能分几份(商),还剩几颗(余数)。一直分到没有糖果为止,然后倒着记录余数。

步骤(以13为例):

  1. 13 ÷ 2 = 6 …… 余 1
  2. 6 ÷ 2 = 3 …… 余 0
  3. 3 ÷ 2 = 1 …… 余 1
  4. 1 ÷ 2 = 0 …… 余 1

把余数从下往上读:1、1、0、1 → 1101。
所以13的二进制是1101。

生活例子
假如你有13个苹果,每次拿出能装2个的盒子,装满了就把剩下的苹果记下来(余数),继续装剩下的……最后盒子数是商,剩下的苹果是余数。把每次剩下的苹果记在一张纸上,从最后一张纸倒着念,就是二进制。


2. 用Python的bin()函数

Python自带的bin()函数可以直接把任何整数转成二进制字符串,不过它会自动加上0b前缀表示这是二进制数。

# 十进制转二进制
num = 13
binary_str = bin(num)      # 结果是 '0b1101'
print(binary_str)          # 输出 0b1101

# 如果不想显示0b,可以用字符串切片去掉前两位
print(binary_str[2:])      # 输出 1101

注意bin()返回的是字符串,不是数字。你可以在字符串前面加int()重新转回十进制:int('0b1101', 2)


3. 自己写一个转换函数

手工过程可以用循环模拟:每次取余数,把商继续除以2。

def decimal_to_binary(n):
    # n:要转换的十进制整数
    if n == 0:
        return "0"          # 特殊情况:0的二进制就是"0"
    result = ""             # 存放二进制字符串,初始为空
    while n > 0:
        # 每次取余数,加在最前面(因为后面的余数对应高位)
        result = str(n % 2) + result
        n = n // 2          # 整数除法,得到商
    return result

print(decimal_to_binary(13))   # 输出 1101
print(decimal_to_binary(0))    # 输出 0

代码解读

  • n % 2 得到当前最低位的余数(0或1)。
  • str(n % 2) + result 把新得到的余数放到字符串的最左边,这样最终顺序就是手工的“从下往上”。
  • n // 2 去掉最后一位,继续处理更高的位。
  • n变成0时,循环结束,返回完整的二进制字符串。

4. 新手容易犯的错误

  • 忘记从下往上读:手工算出来的余数是从上往下记的,但二进制要从下往上写。很多同学会写成顺序的“1011”(错误),正确是“1101”。
  • 忘记处理0:如果输入是0,循环根本不会执行,直接返回空字符串""。所以一定要单独判断if n == 0: return "0"
  • 字符串拼接顺序写反:如果写成result = result + str(n % 2),那就会变成“1101”反过来“1011”,因为新余数加在了右边,导致顺序颠倒。
  • 混淆////是浮点数除法,结果会带小数,导致无限循环。一定要用//(整数除法)。

5. 完整可运行示例

下面是一段完整的代码,包含三种方法:手工模拟、bin()函数、自定义函数。

# 完整示例:十进制转二进制
num = 13   # 要转换的数字

# 方法1:使用Python内置bin()
print("方法1(bin函数):", bin(num))            # 输出 0b1101
print("去掉0b:", bin(num)[2:])                  # 输出 1101

# 方法2:自定义函数(除2取余)
def decimal_to_binary(n):
    # n:要转换的整数
    if n == 0:
        return "0"
    binary_str = ""   # 存储二进制结果
    while n > 0:
        binary_str = str(n % 2) + binary_str  # 余数加在最前面
        n = n // 2      # 整数除法,去掉最低位
    return binary_str

my_result = decimal_to_binary(num)
print("方法2(自定义函数):", my_result)         # 输出 1101

# 验证:用int()转回十进制
print("验证转回十进制:", int(my_result, 2))     # 输出 13

运行结果:

方法1(bin函数): 0b1101
去掉0b: 1101
方法2(自定义函数): 1101
验证转回十进制: 13

6. 相关指引

掌握了十进制转二进制,接下来可以学习:

  • 二进制转十进制:用“位权相加”法,或者Python的int('1101', 2)
  • 八进制和十六进制oct()hex()函数,类似bin(),只是换成除以8或16。
  • 位运算:二进制在编程中常用于设置标志位、加密、图像处理等。

记住:二进制里只有0和1,就像开关只有关和开。掌握了十进制转二进制,你就能读懂计算机的基本语言了!

例题精讲

1单选题

十进制数13转换成二进制的结果是?

A1101
B1011
C1110
D1001
2判断题

使用除2取余法将十进制转换为二进制时,最先得到的余数是二进制数的最高位。

3填空题
以下代码通过手动除2取余法将十进制数转换为二进制字符串。请补全代码。
def dec_to_bin(n):
    result = ""
    while n > 0:
        remainder = n % 2
        result = ___ + result
        n //= 2
    return result if result else "0"
4单选题

在Python中,bin()函数返回值的类型是?

Aint
Bstr
Clist
Dtuple
5填空题
以下代码将十进制数25转换为二进制字符串并去掉前缀'0b',请补全。
num = 25
binary_str = bin(num)[___]
print(binary_str)  # 输出 11001