一、进至转换
1. 数据输入: string
a = '1001'
2. 用 String 表达的 2、8、10、16 进制, 转化为 十进制,用 int
a_2 = int(a, 2)
a_8 = int(a, 8)
a_10 = int(a)
a_16 = int(a, 16)
3. 十进制转换为 2 进制,用 bin:
bin_a_2 = bin(a_2)
4. 十进制转换为 8 进制,用 oct:
oct_a_8 = oct(a_8)
5. 十进制转换为 16 进制, 用 hex:
hex_a_16 = hex(a_16)
总结:用字符串表达的输入,可以按照任意进制的规则,转换为10进制,以10进制为媒介,转化为其他进制。
二、编码
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
2.反码
- 正数的反码是其本身
- 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反 [-1] = [10000001]原 = [11111110]反
3.补码
- 正数的补码就是其本身
- 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补
三、位运算
1. 与: & ,只对最右一位进行计算,返回 0 或 1:
a = '0001'
b = '1001'
a & b = 1
2. 或: | , 对所有位计算:
a = int('0110', 2)
b = int('1000', 2)
print(bin(a|b)) # 0b1110
3. 异或: ^, 对所有位计算:
a = int('0110', 2)
b = int('1000', 2)
print(bin(a^b)) # 0b1110
4. 移位: >> , <<
a = int('0110', 2)
b = int('1000', 2)
print(bin(a>>2)) # 0b1
print(bin(b<<1)) # 0b10000
四、编码转换及其他应用
1. 将补码转换为十进制数:
# 输入 string, 输出 十进制 num
# 补码 到 原码
def B_2_Y(num):
return ~(-1 & num ^ num)
# 原码 到 十进制
def Y_2_N(num):
return int(num, 2)
对于正数,Y_to_N(num)
对于负数,B_2_Y(Y_2_N(num))
2.位运算实现加减乘除
(1)加减
a + b = a ^ b + (a & b) << 1
a - b = a + (-b) = a + ~b + 1
def add(self, a: int, b: int) -> int:
x = 0xffffffff
a, b = a & x, b & x
while b != 0:
a, b = (a ^ b), (a & b) << 1 & x
return a if a <= 0x7fffffff else ~(a ^ x)
(2)乘法