CC++ & Algorithm

认识四种进制:二进制、八进制、十进制和十六进制

简单5
语言版本:C++Python
概述:用生活中数糖果的方式引入四种常见的计数进制,理解它们在计算机中的不同表示。

数数也能有不同玩法——认识四种进制

我们平时数东西,都是用“十进制”——满十进一。比如你有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

新手容易犯的错误

  1. 忘记写前缀:比如直接写1101,Python会当成十进制一千一百零一,而不是二进制哦!
  2. 八进制里出现8或90o18会报错,因为八进制最大数字是7。
  3. 十六进制字母写错:比如写成0x1G(G不是有效数字)。正确的字母是AF(或af)。
  4. 混淆大小写0x1A0x1a都是正确的,但0x1g不行。
  5. 进制转换结果加前缀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

小练习(保留原来的,再加一道)

  1. 猜猜看:0x10是多少?提示:十六进制的10等于十进制16。试着在Python里输出来验证吧!
  2. 把十进制255分别用二进制、八进制、十六进制表示出来(提示:255是0xFF)。
  3. 试试看:int('777', 8) 会得到什么?为什么八进制里能有7?

相关知识点

学会了进制,你就可以更深入地理解:

  • 位运算:跟二进制密切相关的按位与、按位或、左移右移等操作。
  • ASCII码与Unicode:字符在计算机里就是用一个数字(通常是二进制或十六进制)表示的。
  • 颜色与图像:屏幕上的每个颜色都由红绿蓝三个分量组成,每个分量用0255(十六进制00FF)表示。
  • 内存与指针:调试程序时经常看到十六进制的内存地址。

进制转换就像掌握了一门“翻译”技能,让你能看懂计算机底层的语言。多练几次,你就能轻松在四种进制之间来回穿梭啦!

例题精讲

1单选题

以下哪个是合法的二进制数?

A1010
B2010
C0x10
D0b12
2判断题

十六进制数中,F代表十进制15。

3填空题
在Python中,要将十进制数255转换为十六进制字符串,可以使用函数___
4单选题

二进制数1011转换为十进制是多少?

A8
B11
C13
D14
5判断题

八进制数77等于十进制数63。