1)计算负数的逆元
def negative(n):
return bit_add(~n, 1)
2)加法计算
def bit_add(a, b):
b &= (2 ** 32 - 1)
while b:
tmp = a
sum = tmp ^ b
carry = (tmp & b) << 1
return a
3)减法计算
def bit_sub(a, b):
return bit_add(a, negative(b))
4)乘法计算
def bit_mul(a, b):
result = 0
while b:
if b & 0x1:
result = bit_add(result, a)
b >>= 1
a <<= 1
return result
乘法模拟手工计算乘法的流程,将乘数b的二进制表示从左往右移动,当最低位为1时 (b & 0x1 == 1),把被乘数a加到result中,同时将被乘数a向左移动一位。
5)除法计算
def bit_div(x, y):
result = 0
for i in range(32)[::-1]:
if (x >> i) >= y:
result += (1 << i)
x -= (y << i)
return result
考虑32位整数表示 (64位改一下 i 就可以了)。从最大的倍数开始遍历,如果被除数x >> i 大于除数y,说明该位商为1,将1<<i加到结果中,并缩小x。