用移位和加法模拟计算机乘法

2019年11月16日 / 10次阅读 / Last Modified 2019年11月16日
数值计算

写了一小段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 --

本文链接:https://www.pynote.net/archives/1505

留言区

《用移位和加法模拟计算机乘法》有2条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    模拟的是整数的乘法。浮点数的计算更加复杂一点,不过从模拟整数乘法可以想象出,是可以实现的。FPU曾经是最复杂的芯片组成部分。 [回复]

  • 麦新杰

    负数转正数,用abs函数更好! [回复]


前一篇:
后一篇:

More

麦新杰的Python笔记

Ctrl+D 收藏本页


©Copyright 麦新杰 Since 2019 Python笔记

go to top