二进制转换成十进制
中等5二进制转十进制:看懂计算机的“火星文”
计算机世界里所有数据都用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个错误
-
忘记二进制字符串只能用0和1
比如写成"1102",int("1102", 2)会报ValueError,因为2不是二进制数字。 -
混淆指数方向
从右往左指数递增,最右边是2⁰。如果从左往左算(递减),结果会出错。例如"1101"如果从左往右按2⁰、2¹算,就会得到1×1+1×2+0×4+1×8=11,错误。 -
处理前缀时进制参数写错
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取余数的方法。
- 八进制与十六进制转换 —— 计算机中还会用到八进制、十六进制,它们的转换原理和二进制类似。
- 位运算入门 —— 二进制位可以直接进行与、或、异或等操作,是编程中的高级技巧。
例题精讲
二进制数 1101 转换成十进制是多少?
在Python中,执行 int('1010', 2) 的结果是什么?
二进制数 111 转换成十进制的结果是 7。
在Python中,int('100', 2) 返回的数值是 4。
下列Python代码将二进制字符串 '11010' 转换为十进制。请补全空白处的代码。
binary_str = '11010'
decimal_num = ___
print(decimal_num) # 预期输出 26