进制
Python 中的进制表示与转换
进制的基本概念
- 二进制、八进制、十进制、十六进制的定义与特点
- 不同进制在计算机科学中的应用场景
Python 中的进制表示
- 二进制表示:使用
0b
前缀 - 八进制表示:使用
0o
前缀 - 十六进制表示:使用
0x
前缀 - 示例代码:
binary_num = 0b1010
octal_num = 0o12
hex_num = 0xA
Python 中的进制转换
- 十进制转其他进制:使用
bin()
、oct()
、hex()
函数 - 其他进制转十进制:使用
int()
函数 - 示例代码:
decimal_num = 10
print(bin(decimal_num)) # 输出: 0b1010
print(oct(decimal_num)) # 输出: 0o12
print(hex(decimal_num)) # 输出: 0xA
binary_num = '1010'
print(int(binary_num, 2)) # 输出: 10
进制转换的常见应用
- 数据存储与传输中的进制转换
- 网络编程中的 IP 地址与端口号的进制表示
- 加密算法中的进制转换
进制转换的注意事项
- 不同进制之间的转换精度问题
- 进制转换中的溢出与截断问题
- 示例代码:
large_num = 0xFFFFFFFF
print(int(large_num)) # 输出: 4294967295
进制转换的进阶技巧
- 使用
format()
函数进行进制格式化输出 - 自定义进制转换函数
- 示例代码:
num = 255
print(format(num, 'b')) # 输出: 11111111
print(format(num, 'o')) # 输出: 377
print(format(num, 'x')) # 输出: ff
2进制口诀:8421口诀
8421口诀是一种用于快速记忆二进制与十进制之间转换的方法。它基于二进制的位权值,即每一位的权重分别是8、4、2、1。通过这个口诀,可以快速将二进制数转换为十进制数,或者将十进制数转换为二进制数。
8421口诀的使用方法
将二进制数的每一位与对应的位权值相乘,然后将结果相加,即可得到对应的十进制数。例如,二进制数1011
可以按照以下方式转换为十进制:
1 * 8 = 8
0 * 4 = 0
1 * 2 = 2
1 * 1 = 1
将结果相加:8 + 0 + 2 + 1 = 11
,因此二进制数1011
对应的十进制数是11
。
示例
-
二进制数
1101
转换为十进制:1 * 8 = 8 1 * 4 = 4 0 * 2 = 0 1 * 1 = 1
结果:
8 + 4 + 0 + 1 = 13
-
二进制数
1001
转换为十进制:1 * 8 = 8 0 * 4 = 0 0 * 2 = 0 1 * 1 = 1
结果:
8 + 0 + 0 + 1 = 9
反向转换
8421口诀也可以用于将十进制数转换为二进制数。通过将十进制数分解为8、4、2、1的组合,可以快速得到对应的二进制数。例如,十进制数10
可以分解为8 + 2
,因此对应的二进制数为1010
。
需要哪一个相加,才能获得要转换的十进制的数,则在下方填1,若不需要则填0
示例
-
十进制数
7
转换为二进制:7 = 4 + 2 + 1
对应的二进制数为
0111
-
十进制数
12
转换为二进制:12 = 8 + 4
对应的二进制数为
1100
通过8421口诀,可以快速进行二进制与十进制之间的转换,特别适用于初学者或需要快速计算的场景。
进制转换的实践案例
- 实现一个简单的进制转换工具
- 处理大整数的进制转换问题
- 示例代码:
def convert_base(num, base):
digits = "0123456789ABCDEF"
if num < base:
return digits[num]
else:
return convert_base(num // base, base) + digits[num % base]
print(convert_base(255, 16)) # 输出: FF
多进制转十进制(计算方法)
二转十
例如:2进制下的1010转为十进制
0b1010=1*(2**3)+0*(2**2)+1*(2**1)+0*(2**0)
-->8+0+2+0
-->8+2
-->10
八转十
例如:8进制下的0o12转为十进制
0o12=1*(8**1)+2*(8**0)
-->8+2
-->10
十六转十
例如:0x11转为十进制
0x11=1*(16**1)+1*(16**0)
-->16+1
-->17
多进制转2进制转16进制
一般计算16进制,我们先转为2进制,再转为16进制。
0o664通过421
-->0b110 110 100
-->0b1 1011 0100
0b1 1011 0100转16进制
1011通过8421口诀
0b1-->0x1
-->1011-->8+4+1-->11-->0xb
0100通过8421
-->4
-->0x1b4
码制(详细可看C语言D5)
原码:
有符号整数的二进制编码方式,其中最高位表示符号位,0表示正数,1表示负数。其余位表示数值的绝对值。例如,+10的原码为0000 1010,-10的原码为1000 1010。
通常由原码转反码,由反码转补码,当补码再补码=原码
补充:
为什么都是8位:
计算机中存储的数据单位=1字节=8位
反码:
反码特点:
正数情况下与原码的值不变
负数情况下,符号位不变,但其他部分取反(0变1,1变0)
补码:
在计算机系统中,数值一律用补码来存储
补码特点:
对于正数来说,原码、反码、补码皆相同
对于负数来说,其补码=它的反码加1
补码符号位不动,其他位求反,最后整个 数+1,得到补码
总结:
由-1来计算
原码
0b1000 0001
反码
0b1111 1110
补码
0b1111 1111
逻辑运算符
逻辑
- 与逻辑==&
- 或逻辑==|
- 非逻辑==~
运算符
+,-,*,/,//向下取整数,%取模,**幂
python2中/和//都是除整
位运算符
- &位与,|位或,^异或,<<左移,>>右移
- ~按位取反,包括符合位
- &相当于相乘,|相当于相加,^相异出1
- 1<<2就是将1向左移动两个位置,同理>>将1向右移动两个位置
提问5&3=?
5 & 3
0b0000 0101
0b0000 0011 &
-----------------
0b0000 0001 1
5|3=?
5 | 3
0b0000 0101
0b0000 0011 |
-----------------
0b0000 0111 7
5^3=?
5 & 3
0b0000 0101
0b0000 0011 ^
-----------------
0b0000 0110 6
1<<3=?
1 << 3
0b0000 0001 <<3
-----------------
0b0000 1000 8
相当于
1*(2**3)=8
5<<3
5*(2*3)=40
5>>3=?
5 & 3
0b0000 0101 >>
-----------------
5//(2**3) 0
~5=?
~5
0b0000 0101 ~
-----------------
0b1111 1010 补码
0b1000 0110 原码
-0b110
-6