Python: 数值进制前缀 进制转换 原码 反码 补码
二进制、八进制、十六进制的数值常量表示前缀
进制基数(radix) | 前缀 | 示例 |
---|---|---|
二进制 Binary system | 0b 0B | 0b11 = 2+1=3 |
八进制 Octal number system | 0o 0O 0 | 0o11 = 8+1=9 |
十进制 Decimal system | 无前缀 | 11 = 11 |
十六进制 Hexadecimal | 0x 0X | 0x11 |
十进制,直接写数值即可。
而八进制较为特殊,在不同语言中的表示有细微的差异。
- JavaScript/Python:八进制数值的前缀可以为
0 0o 0O
三种皆可。 - Java/C:八进制数值只能用一种前缀
0
,不能用0o 0O
,否则会报错
进制转换
1. Python进制转换
1.二、八、十六进制转十进制:
int(str,base=要转换的进制数)
二进制转十进制:int('1001',2) 二进制转八进制:int('10',8) 二进制转十六进制:int('12',16)
str可以带前缀,也可以不带
2.十进制转二、八、十六进制
2.1 format(int,'进制数')
b代表二进制,o代表八进制,x代表十六进制
返回无前缀字符串
i=1234 十进制转二进制: format(i,'b') # 10011010010 十进制转八进制: format(i,'o') # 2322 十进制转十六进制: format(i,'x') # 4d2
2.1 bin(int) oct(int) hex(int)
返回带前缀字符串
i = 13 十进制转二进制: bin(i) # 0b1101 十进制转八进制: oct(i) # 0o15 十进制转十六进制: hex(i) # 0xd
2. 进制转换
二进制:由2个数字组成,有0 和 1 例: 0b101
八进制:由8个数字组成,有0,1,2,3,4,5,6,7 例: 0o127
十进制:有10个数字组成,有0,1,2,3,4,5,6,7,8,9 例: 250
十六进制:有16个数字组成,有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(字母大小写都可以,分别代表10,11,12,13,14,15) 例:0xff 0Xff 0XFF
二进制 转化成 十进制
例: 0b10100101
运算:1 * 20 + 0 * 21+ 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 0 * 26+ 1 * 27= 1 + 0 + 4 + 0 + 0 + 32 + 0 + 128 = 165
八进制 转化成 十进制
例: 0o127
运算: 7 * 80 + 2 * 81 + 1 * 82 = 7+16+64 = 87
十六进制 转化成 十进制
例: 0xff
运算:15 * 160 + 15 * 161= 255
十进制 转化成 二进制
例:426 => 0b110101010
运算过程: 用426除以2,得出的结果再去不停地除以2,
直到除完最后的结果小于2停止,
在把每个阶段求得的余数从下到上依次拼接完毕即可
十进制 转化成 八进制
例:426 => 0o652
运算过程: 用426除以8,得出的结果再去不停地除以8,
直到除完最后的结果小于8停止,
在把每个阶段求得的余数从下到上依次拼接完毕即可
十进制 转化成 十六进制
运算过程: 用426除以16,得出的结果再去不停地除以16,
直到除完最后的结果小于16停止,
在把每个阶段求得的余数从下到上依次拼接完毕即可
二进制与八进制转换
二进制与八进制对应关系:
八进制 | 二进制 | 八进制 | 二进制 |
---|---|---|---|
0 | 000 | 4 | 100 |
1 | 001 | 5 | 101 |
2 | 010 | 6 | 110 |
3 | 011 | 7 | 111 |
例:1010100101
八进制:从右向左 3位一隔开 不够三位用0补位 变成:
001 010 100 101
0o 1 2 4 5
二进制与十六进制转换
二进制与十六进制对应关系:
十六进制 | 二进制 | 十六进制 | 二进制 |
---|---|---|---|
0 | 0000 | 8 | 1000 |
1 | 0001 | 9 | 1001 |
2 | 0010 | A | 1010 |
3 | 0011 | B | 1011 |
4 | 0100 | C | 1100 |
5 | 0101 | D | 1101 |
6 | 0110 | E | 1110 |
7 | 0111 | F | 1111 |
例:1010100101
十六进制:从右向左 4位一隔开 不够四位用0补位 变成:
0010 1010 0101
0x 2 A 5
八进制 与 十六进制的转换
先转换成二进制 再去对应转换
比如:0x2a5 转换成 1010100101 再转8进制 0o1245
原码,反码,补码
概念
计算机的所有数据在底层都是以二进制的[补码]形式存储
实际人们看到的数字是[原码]转化来的
而[原码]是通过[补码]得到的
补码 -> 原码 -> 最后人们看到的数
进制转换的时候需要先把内存存储的补码拿出来变成原码在进行转换输出
计算机底层存储的补码:
正数高位补0 负数高位补1(前面空白位全是1)
数字 1 00000000 1 正数高位都补0
数字-1 11111111 1 负数高位都补1
原码: 用来转换对应进制
反码: 二进制码0变1,1变0叫做反码,反码用于原码补码之间的转换.(符号位不变)
补码: 用来做数据的存储运算. 补码提出的根源是让计算机底层的实现减法操作(可以表达出一个数的正负)
言外之意:计算机默认只会做加法,例:5+(-3) => 5 - 3
乘法除法:是通过左移和右移 << >> 来实现
运算
(原码 反码 补码之间的转换 , 符号位不要动)
正数: 原码 = 反码 = 补码
负数: 原码 = 补码取反加1 给补码求原码
负数: 补码 = 原码取反加1 给原码求补码
举例
- 原码:规定了字节数,写明了符号位,就得到了数据的原码
- 反码:正数的反码是其原码,负数的反码是其原码的符号位不动,其他位取反即0变成1,1变成0
- 补码:正数的补码是其原码,负数的补码是其反码的最低位加1
1的原码、反码、补码:
原码:00000000 00000000 00000000 00000001
反码:00000000 00000000 00000000 00000001
补码:00000000 00000000 00000000 00000001
-1的原码、反码、补码:
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
故1+(-1)的结果为:
1的补码:00000000 00000000 00000000 00000001
-1的补码: 11111111 11111111 11111111 11111111
-1+1补码结果:00000000 00000000 00000000 00000000
该补码的原码为0,即为0