Python 中的进制砖换及编码

一、进至转换

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)乘法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值