认识四种进制:二进制、八进制、十进制和十六进制
简单5数数也能有不同玩法——认识四种进制
我们平时数东西,都是用“十进制”——满十进一。比如你有10颗糖,就会说“1堆”,再拿10颗又变成第2堆。但你知道吗?计算机可不会这样数数,它只认得“二进制”,因为它的电路只有“开”和“关”两种状态。为了让咱们写代码更方便,还出现了“八进制”和“十六进制”,它们能更简洁地表示长长的二进制数。今天,我们就来好好认识这四位“数数小伙伴”。
十进制——我们的老朋友
十进制用0~9共10个数字,每数到10就向高位进1。比如168,它代表1个百、6个十和8个一,即1×100 + 6×10 + 8。我们买东西、算零花钱、考试分数,用的全是十进制。
Python里写十进制: 直接写数字就行,不需要加任何前缀。
score = 98 # 考试分数98分(十进制)
candy = 15 # 口袋里有15颗糖(十进制)
二进制——计算机的母语
二进制只用0和1两个数字,满二进一。计算机的每个零件都只有两种状态:通电(1)和断电(0),所以它天生就会二进制。比如二进制数1101,从右往左每一位分别代表1、2、4、8(2的次方),所以1101 = 1×8 + 1×4 + 0×2 + 1×1 = 13(十进制)。
生活中的二进制例子:
- 开关灯: 一盏灯只有“亮”和“灭”,就像1和0。
- 投票表决: 你投“同意”还是“反对”,也是两个选项。
- 猜硬币: 硬币落地只有“正面”和“反面”。
Python里写二进制: 数字前面加 0b(或 0B,不区分大小写)。
lamp = 0b1101 # 二进制数,代表十进制13
vote = 0b1010 # 二进制数,代表十进制10
print(lamp) # 输出 13
print(vote) # 输出 10
八进制——二进制的“速记法”
八进制用0~7共8个数字,满八进一。因为8是2的3次方,所以每3位二进制数正好对应1位八进制数。比如二进制101 110可以分成101(5)和110(6),写成八进制就是56。它比二进制短,但比十进制更容易转换成二进制。
生活中的例子: 以前Unix系统里,文件权限就用八进制表示(比如755表示文件所有者可读写执行、群组可读可执行、其他人可读可执行)。
Python里写八进制: 数字前面加 0o(或 0O)。
perm = 0o755 # 八进制数,文件权限755
print(perm) # 输出 493(因为7×64+5×8+5=493)
小贴士: 八进制里没有数字8和9,如果你写成0o18,Python会报错哦!
十六进制——二进制的“缩写大师”
十六进制用09和AF(A=10,B=11,C=12,D=13,E=14,F=15)共16个数字,满十六进一。因为16是2的4次方,所以每4位二进制数对应1位十六进制数。比如二进制1101 1010可以写成DA(D=13,A=10→十进制218)。
生活中的十六进制:
- 颜色值: 网页里用
#FF0000表示红色(FF是255,代表红色分量最大)。 - 内存地址: 电脑里经常看到像
0x7ffeefbff5c8这样的地址。 - Unicode码点: 比如字母“A”的码点是
U+0041(十六进制41)。
Python里写十六进制: 数字前面加 0x(或 0X),字母A~F可以大写也可以小写。
color = 0xFF0000 # 十六进制,代表红色(十进制16711680)
letter = 0x41 # 十六进制,代表大写字母A的ASCII码(十进制65)
print(color) # 输出 16711680
print(letter) # 输出 65
四种进制如何互相转换?
Python给了我们很方便的内置函数:
| 函数 | 作用 | 例子 |
|---|---|---|
bin(x) | 把十进制整数x转成二进制字符串(带前缀0b) | bin(13) → '0b1101' |
oct(x) | 把十进制整数x转成八进制字符串(带前缀0o) | oct(13) → '0o15' |
hex(x) | 把十进制整数x转成十六进制字符串(带前缀0x) | hex(13) → ``'0xd'` |
int(s, base) | 把字符串s按照base进制转成十进制整数 | int('1101', 2) → 13 |
下面用代码演示一下:
num = 100 # 十进制数100
bin_str = bin(num) # 转二进制字符串
oct_str = oct(num) # 转八进制字符串
hex_str = hex(num) # 转十六进制字符串
print(bin_str) # 输出 0b1100100
print(oct_str) # 输出 0o144
print(hex_str) # 输出 0x64
# 反过来,把其他进制字符串转成十进制
back = int('0b1100100', 2) # 注意:int()第二个参数是基数,字符串可以带前缀也可以不带
print(back) # 输出 100
新手容易犯的错误
- 忘记写前缀:比如直接写
1101,Python会当成十进制一千一百零一,而不是二进制哦! - 八进制里出现8或9:
0o18会报错,因为八进制最大数字是7。 - 十六进制字母写错:比如写成
0x1G(G不是有效数字)。正确的字母是AF(或af)。 - 混淆大小写:
0x1A和0x1a都是正确的,但0x1g不行。 - 进制转换结果加前缀:
bin()返回的字符串自带0b,如果直接拿去int()转换时,第二个参数是2就可以,但记得字符串里最好也带前缀保持一致。
完整示例:一个进制计算器
下面这个程序会问你想把什么数字转成其他进制:
# 进制转换演示程序
print("欢迎使用进制小助手!")
num = int(input("请输入一个十进制整数:")) # 从键盘输入十进制数
binary = bin(num) # 转成二进制字符串
octal = oct(num) # 转成八进制字符串
hexadecimal = hex(num) # 转成十六进制字符串
print("这个数的不同写法:")
print("十进制:", num)
print("二进制:", binary)
print("八进制:", octal)
print("十六进制:", hexadecimal)
# 再试一次:从其他进制读入
print("\n也可以从其他进制读入:")
user_input = input("请输入一个十六进制数(带0x前缀):")
dec_val = int(user_input, 16) # 按16进制转成十进制
print("它等于十进制", dec_val)
运行一次试试:
欢迎使用进制小助手!
请输入一个十进制整数:26
这个数的不同写法:
十进制: 26
二进制: 0b11010
八进制: 0o32
十六进制: 0x1a
也可以从其他进制读入:
请输入一个十六进制数(带0x前缀):0x10
它等于十进制 16
小练习(保留原来的,再加一道)
- 猜猜看:
0x10是多少?提示:十六进制的10等于十进制16。试着在Python里输出来验证吧! - 把十进制255分别用二进制、八进制、十六进制表示出来(提示:255是
0xFF)。 - 试试看:
int('777', 8)会得到什么?为什么八进制里能有7?
相关知识点
学会了进制,你就可以更深入地理解:
- 位运算:跟二进制密切相关的按位与、按位或、左移右移等操作。
- ASCII码与Unicode:字符在计算机里就是用一个数字(通常是二进制或十六进制)表示的。
- 颜色与图像:屏幕上的每个颜色都由红绿蓝三个分量组成,每个分量用0
255(十六进制00FF)表示。 - 内存与指针:调试程序时经常看到十六进制的内存地址。
进制转换就像掌握了一门“翻译”技能,让你能看懂计算机底层的语言。多练几次,你就能轻松在四种进制之间来回穿梭啦!
例题精讲
以下哪个是合法的二进制数?
十六进制数中,F代表十进制15。
在Python中,要将十进制数255转换为十六进制字符串,可以使用函数___。二进制数1011转换为十进制是多少?
八进制数77等于十进制数63。