python左移位运算_用移位和加法模拟计算机乘法

写了一小段python程序,用移位和加法这两种运算,模拟计算机做二进制乘法的过程!ALU单元做乘法,就是移位和加法。其实加法几乎是ALU单元唯一进行的运算,自己与自己相加,就是左移一位。左移一位,就相当于乘以2(请参考:用移位来进行乘除2的运算)。本文更进一步,用python直接模拟任意数据的乘法运算。

一个数,乘以10,就是左移1位;乘以100,就是左移2位;乘以101,就是自己加上自己左移2位后的和;乘以111,就是自己加上左移1位再加上左移2位的累计和......这个过程能想明白吧?

模拟计算乘法代码如下:

def multiply(n1, n2):

result = 0

sign = 0

if n1 == 0 or n2 == 0:

return 0

if n1 < 0 and n2 < 0:

n1 = -n1; n2 = -n2

if n1 > 0 and n2 < 0:

n2 = -n2; sign = 1

while n2 != 0:

if n2&1 != 0: result += n1

n1 <<= 1; n2 >>= 1

return result if not sign else -result

print(multiply(12,2), 12*2)

print(multiply(23,100), 23*100)

print(multiply(123,456), 123*456)

print(multiply(-10,789), -10*789)

print(multiply(10,-56789), 10*-56789)

print(multiply(-12345,-98765), -12345*-98765)

print(multiply(0, 7788), 0*7788)

multiply函数先处理了一点符号方面的细节;在循环中,n1左移,n2右移,n2&1是在判断数值的奇偶性,如果是奇数,结果就要增加,偶数就跳过,判断奇偶就是在判断那一位是0还是1。这个过程直到n2等于0为止(这时n2所以的1比特位都移走了)。

运行效果如下:

$ python3 multiplation.py

24 24

2300 2300

56088 56088

-7890 -7890

-567890 -567890

1219253925 1219253925

0 0

结果都是正确的。

-- EOF --

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值