CC++ & Algorithm

二进制转换成十进制

中等5
语言版本:C++Python
概述:用“按权展开相加”法把二进制变成十进制,并学会用`int()`函数快速转换。

二进制转十进制:看懂计算机的“火星文”

计算机世界里所有数据都用0和1表示,比如你玩游戏时看到的分数、照片的颜色、甚至你输入的文字,在计算机底层都是一串串的二进制数字。那么,当计算机给你一串像 1101 这样的“火星文”时,我们怎么知道它代表多少呢?把它变成我们熟悉的十进制数字就行了!今天就来学会两种方法:手工按权展开和用Python快速转换。


什么是“权值”?—— 每个二进制位的“重量”

我们平时用的十进制,每一位都有不同的“重量”。例如数字 234,从右往左:

  • 个位:4 的重量是 1 = 10⁰
  • 十位:3 的重量是 10 = 10¹
  • 百位:2 的重量是 100 = 10²

二进制也是一样的道理,只不过底数从10变成了2。二进制从右往左,每一位的重量分别是:

  • 第0位(最右边):2⁰ = 1
  • 第1位:2¹ = 2
  • 第2位:2² = 4
  • 第3位:2³ = 8
  • 第4位:2⁴ = 16
    ……依此类推。

生活小例子:假如你妈妈给你零花钱,规定“第一个抽屉里每张2元,第二个抽屉每张4元,第三个抽屉每张8元……”,那么你要拿多少钱,就看每个抽屉放了几张钱。二进制也是这样:每个位上的1代表“有”这张“金额”,0代表“没有”。


手工方法:按权展开求和

把二进制数中每一位的数字(0或1)乘以它所在位置的权值,然后把所有乘积加起来,就得到了十进制数。下面以 1101 为例:

二进制数:   1     1     0     1
对应权值:  2³=8  2²=4  2¹=2  2⁰=1
计算:
  1 × 8 = 8
+ 1 × 4 = 4
+ 0 × 2 = 0
+ 1 × 1 = 1
————————
总和 = 13

所以二进制 1101 就是十进制 13。是不是很简单?只要从右往左数好位置,乘2的次方,再相加。

练习一下:试试二进制 101010 转换为十进制。

  • 从右往左位置0~5:
    • 第0位(最右):0 × 2⁰ = 0
    • 第1位:1 × 2¹ = 2
    • 第2位:0 × 2² = 0
    • 第3位:1 × 2³ = 8
    • 第4位:0 × 2⁴ = 0
    • 第5位:1 × 2⁵ = 32
  • 总和:0 + 2 + 0 + 8 + 0 + 32 = 42
    答案就是 42。厉害吧!

用Python的int()快速转换

如果你已经写好了二进制字符串(比如从文件里读出来的),Python自带的 int() 函数可以一步到位。它有两个参数:第一个是要转换的字符串,第二个是指定原数字的进制(2表示二进制)。

# 二进制字符串(没有前缀)
binary_str = "1101"          # 二进制字符串
decimal_num = int(binary_str, 2)   # 第二个参数是进制,2表示二进制
print(decimal_num)                 # 输出 13

# 如果字符串有0b前缀(Python中表示二进制的写法)
bin_str = "0b1101"          # 带前缀的二进制字符串
print(int(bin_str, 0))            # 参数用0,自动识别前缀,输出 13

注意:int("1101", 2) 会把 "1101" 当作二进制处理,返回整数13。如果字符串里出现了非0或1的字符,或者进制写错了(比如 int("1102", 2) 会报错),程序就会崩溃。


自己写一个转换函数:亲手实现按权展开

用循环模拟手工计算的过程,既加深理解,又灵活可控。我们写一个函数 binary_to_decimal(b),b是一个二进制字符串。

def binary_to_decimal(b):
    # b是一个字符串,如"1101"
    decimal = 0            # 存放最终结果
    power = len(b) - 1     # 最高位的指数(最左边的位)
    for digit in b:        # 遍历字符串中的每个字符
        if digit == '1':   # 如果这一位是1,就加上对应的权值
            decimal += 2 ** power
        # 如果digit是'0',什么都不加
        power -= 1         # 处理下一位,指数减1
    return decimal

# 测试
print(binary_to_decimal("1101"))   # 输出 13
print(binary_to_decimal("101010")) # 输出 42

更强的写法:也可以直接用 int(digit) * (2 ** power),这样就不需要判断 if 了,但要注意 digit 是字符,需要转成整数。

def binary_to_decimal_v2(b):
    decimal = 0
    power = len(b) - 1
    for digit in b:
        decimal += int(digit) * (2 ** power)   # 直接乘,digit是0或1
        power -= 1
    return decimal

新手容易犯的3个错误

  1. 忘记二进制字符串只能用0和1
    比如写成 "1102"int("1102", 2) 会报 ValueError,因为2不是二进制数字。

  2. 混淆指数方向
    右往左指数递增,最右边是2⁰。如果从左往左算(递减),结果会出错。例如 "1101" 如果从左往右按2⁰、2¹算,就会得到1×1+1×2+0×4+1×8=11,错误。

  3. 处理前缀时进制参数写错
    int("0b1101", 2) 其实可以,但更简洁是 int("0b1101", 0)。如果写了 int("0b1101", 10) 会当成十进制字符串里面的0b,导致 ValueError


完整可运行示例(带输入)

下面是一个完整的程序,让用户输入二进制字符串,程序输出对应的十进制数,并显示计算过程。

# 完整示例:二进制转十进制(带输入)
def binary_to_decimal(b):
    # b: 二进制字符串(如"1101")
    decimal = 0            # 存放结果
    power = len(b) - 1     # 最高位的指数
    print("计算过程:")
    for digit in b:
        weight = 2 ** power               # 当前位的权值
        if digit == '1':
            decimal += weight
            print(f"{digit} × 2^{power} = {weight}")
        else:
            print(f"{digit} × 2^{power} = 0 (跳过)")
        power -= 1
    print(f"总和 = {decimal}")
    return decimal

# 获取用户输入
user_input = input("请输入一个二进制数(如1101):")
result = binary_to_decimal(user_input)
print(f"二进制 {user_input} 对应的十进制数是:{result}")

运行效果:

请输入一个二进制数(如1101):1101
计算过程:
1 × 2^3 = 8
1 × 2^2 = 4
0 × 2^1 = 0 (跳过)
1 × 2^0 = 1
总和 = 13
二进制 1101 对应的十进制数是:13

想一想

如果二进制很长,比如 101010,按权展开法也能轻松算出结果。你还可以试试更大的数,比如 11111111(8个1),这对应十进制多少?提示:它等于2⁸-1=255,也就是一个字节的最大值。用上面的代码验证一下吧!


相关指引

  • 十进制转二进制 —— 反过来,把十进制变成二进制,用不断除以2取余数的方法。
  • 八进制与十六进制转换 —— 计算机中还会用到八进制、十六进制,它们的转换原理和二进制类似。
  • 位运算入门 —— 二进制位可以直接进行与、或、异或等操作,是编程中的高级技巧。

例题精讲

1单选题

二进制数 1101 转换成十进制是多少?

A11
B12
C13
D14
2单选题

在Python中,执行 int('1010', 2) 的结果是什么?

A8
B10
C9
D11
3判断题

二进制数 111 转换成十进制的结果是 7。

4判断题

在Python中,int('100', 2) 返回的数值是 4。

5填空题
下列Python代码将二进制字符串 '11010' 转换为十进制。请补全空白处的代码。

binary_str = '11010'
decimal_num = ___  
print(decimal_num)  # 预期输出 26