进制类型 | 组成 | 代码格式 |
2进制 | 由2个数字组成,有0 和 1 | 0b101 |
8进制 | 由8个数字组成,有0,1,2,3,4,5,6,7 | 0o127 |
10进制 | 有10个数字组成,有0,1,2,3,4,5,6,7,8,9 | 258 |
16进制 | 有16个数字组成,有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f (字母不区分大小写, a至f分别代表10,11,12,13,14,15) | 0xff、0Xff、0XFF |
2.进制转换
其他进制转换为10进制的计算公式:∑X * Yn; 其中 X 为第 n 位的数值,Y 为进制值[2, 8, 16],n为第几位,注意:n 是从 0 开始。python 中用于进制转换的内置函数有:
- bin(x): 将 x 转为 2 进制.
- oct(x): 将 x 转为 8 进制.
int
(x, base=10): 将 x 转为 10 进制, 如果 x 是其他的进制数的字符串, 则 base 应为相应的进制数. 如 int("0b10100101", 2).也可以使用 format 函数转化, 具体可以自行查阅.- hex(x): 将 x 转为 16 进制.
2.1. 2进制和10进制之间的转换
(1)2进制转化为10进制:2进制如 0b10100101 转化为十进制时,运算为:1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^5 + 0*2^6 + 1*2^7= 1 + 0 + 4 + 0 + 0 + 32 + 0 + 128 = 165在Python中,可以使用 int 内置函数来转化为2进制,例如:int(0b10100101)(2)10进制转化为2进制用待除数(如 426)除以2,得出的结果再去不停地除以2,直到除完最后的结果小于2停止,,在把每个阶段求得的余数从下到上依次拼接完毕即可。在Python中,可以使用 bin 内置函数来转化为2进制,例如:bin(98)
(1)8进制转化为10进制:将8进制(0o127)转换为10进制:运算为:7*8^0 + 2*8^1 + 1*8^2 = 7 + 16 + 64 = 87在Python中,可以使用 oct 内置函数来转化为2进制,例如:int(0o127)(2)10进制转化为8进制例如:用426除以8,得出的结果再去不停地除以8, 直到除完最后的结果小于8停止, 在把每个阶段求得的余数从下到上依次拼接完毕即可在Python中,可以使用 oct 内置函数来转化为2进制,例如:oct(426)
(1)16进制转化为10进制:例如:带转化数为0xff ,运算为:15*16^0 + 15*16^1 = 255在Python中,可以使用 oct 内置函数来转化为2进制,例如:int(0x42a)(2)10进制转化为16进制:例如用426除以16,得出的结果再去不停地除以16, 直到除完最后的结果小于16停止, 在把每个阶段求得的余数从下到上依次拼接完毕即可在Python中,可以使用 oct 内置函数来转化为2进制,例如:hex(426)
二. 原码、补码和反码
1. 简介
计算机的所有数据在底层都是以二进制的补码形式存储,实际人们看到的数字是原码转化来的,而原码是通过补码得到的。即:补码 -> 原码 -> 最后人们看到的数。进制转换的时候需要先把内存中存储的补码拿出来变成原码在进行转换输出。正数高位补0负数高位补1(前面空白位全是1)数字 1 00000000 1 正数高位都补0数字-1 11111111 1 负数高位都补1原码: 用来转换对应进制反码: 二进制码0变1,1变0叫做反码,反码用于原码补码之间的转换.(符号位不变)补码: 用来做数据的存储运算. 补码提出的根源是让计算机底层的实现减法操作(可以表达出一个数的正负)言外之意:计算机默认只会做加法,例:5+(-3) => 5 - 3 乘法除法:是通过左移 << 和右移 >> 来实现
正数: 原码 = 反码 = 补码负数: 原码 = 补码取反+1 给补码求原码负数: 补码 = 原码取反+1 给原码求补码(原码 反码 补码之间的转换 , 符号位不要动)
三. 位运算 (偏算法)
前面提到, 计算机以二进制的形式存储的. 而位运算说穿了, 就是直接对整数在内存中的二进制位进行操作, 不需要转成 10 进制, 因此处理速度比较快.
1. 位运算常用的运算
- 与: &; 两位都为 1 时, 结果为 1, 否则为 0;
- 或: |; 两位都为 0 时, 结果为 0, 否则为 1;
- 异或: ^; 两位相同为 0, 相异为 1
- 取反: ~; 0 变 1, 1 变 0;
- 左移: <<; 各二进制位全部左移若干位, 高位丢弃, 低位补 0;
- 右移: >>; 各二进制位全部右移若干位, 低位丢弃, 高位补 0; (有符号数, 各编译器处理方法不一样, 有的补符号位(算术右移), 有的补 0 (逻辑右移))
2. 异或操作的特点
x ^ 0 = xx ^ 1s = ~x # 1s 是二进制位全部位 1 的数, 下同x ^ (~x) = 1sx ^ x = 0# 如果 a ^ b = c, 那么 a^c = b, b^c = a 成立, 交换律a ^ b = c # ==> a^c = b, b^c = a# 结合律a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c
3. 常用的位运算操作
# 判断奇偶, 相当于 (x % 2) == 1x & 1 == 1 or == 0 # x 清零最低位的 1x = x & (x - 1) # 得到最低为的 1x & -x
4. 更复杂的位运算操作
# 1. 将 x 最右边的 n 位 清零x & (~0 << n) # 2. 获取 x 的第 n 位值 (0 或 1)(x >> n) & 1 # 3. 获取 x 的第 n 位的幂值x & (1 << (n - 1)) # 4. 仅将第 n 位置为 1x | (1 << n) # 5. 仅将第 n 位置为 0x & (~(1 << n)) # 6. 将 x 最高位至第 n 位(含)清 0x & ((1 << n) - 1) # 7. 将第 n 位至第 0 位(含)位清 0x & (~((1 << (n + 1)) - 1))