booth算法(补码一位乘) python实现

补码一位乘

可能表达不是特别清楚 主要还是看代码吧!(多多指教 谢谢1)

其实就是计算机中的乘法实现:在计算机中  数字是用补码表示的 ,想对于计算机计算较为简单;这里不做介绍

B * C =A  这里B为被乘数,C为乘数

booth:将B表示为补码时符号为用两个1或0表示,将C表示为补码时 符号为用一个0或1表示  如-0.1101*-0.1011  B补码:11.0011 ,-B补码:00.1101 ,其中B补码的前两个1为符号位; -B的补码中前两个0为符号位。  C的补码1.0101中 前一个1位符号位  最后在B的补码后面忝一个0开始计算 。

计算规则:从B补码的倒数第二位开始  这里取i为下标,B[i] ,B[i+1]  若为01则用C+(B补)运算  若为10则用C+(-B补)运算,将计算结果的最后一位作为结果先保存,从结果末尾除去,并在结果前添加0或1(第一位为0加0 否则加1)  将此作为新的C;然后i-1  开始新的运算 直到最后

代码如下:

def getcplmt(st,f=0):#获取补码
    s=st.copy()
    flag=s[0]
    s.reverse()
    i=s.index('1')+1
    if(flag is '-'):
        for t in s[i:]:
            if(t is '1'):
                s[i]='0'
            elif(t is '0'):
                s[i]='1'
            else:
                s[i]=t
            i += 1
        s.reverse()
        s.remove('-')
        s.insert(0,'1')
        if(f!=0):
            s.insert(0, '1')
    else:
        s.reverse()
        s.insert(0,'0')
        if (f != 0):
            s.insert(0, '0')
    return s
def get_x(xt):#-x获取
    x=xt.copy()
    if (x[0] is '-'):
        x.remove('-')
        return getcplmt(x,1)
    else:
        x.insert(0, '-')
        return getcplmt(x,1)
def format(st):#先格式化数据,除去前面的零  方便代码实现
    s=st.copy()
    i=0
    if(s[0] is '-'):
        i=1
    if '.'in s:
        while(s[i] is '0'):
            s.remove('0')
    return s
def add(A,B):#二进制相加
    A=A.copy()
    B=B.copy()
    i=len(B)-1
    d = 0  # 进位
    while(i>=0):
        if(A[i] is '0' and B[i] is '0'):
           if(d==0):
                A[i]='0'
           else:
               A[i]='1'
               d=0
        elif(A[i] is '1' and B[i] is '1'):
            if (d == 0):
                A[i] = '0'
            else:
                A[i] = '1'
            d=1
        else:
            if(d==0):
                A[i]='1'
            else:
                A[i]='0'
                d=1
        i-=1
    return A
def coculate(X,_X,Y):#补码一位乘
    B = X.copy()
    _B = _X.copy()
    C = Y.copy()
    if ('.'in X):
        B.remove('.')
        _B.remove('.')
    A = ['0' for i in B]
    if('.'in C):
        C.remove('.')
    C.append('0')
    i=len(C)-2
    Cn=[]
    re=[]

    while(i>=0):
        if(C[i] is '1' and C[i+1] is '0'):
            Cn.append('-')
        elif(C[i] is '0' and C[i+1] is '1'):
            Cn.append('+')
        else:
            Cn.append('0')
        i-=1
    l=len(Cn)-1
    i=0
    for t in Cn:
        if(t is '+'):
            A=add(A,B)
        elif(t is '-'):
            A = add(A,_B)
        if(l!=i):
            re.insert(0,A.pop())
            if (A[0] is '1'):
                A.insert(0,'1')
            else:
                A.insert(0,'0')
        i+=1
    A.extend(re)
    return A
def main():
    xt,yt=input("请输入乘数被乘数 空格隔开").split()
    x=format(list(xt))
    y=format(list(yt))
    X=getcplmt(x,1)
    _X=get_x(x)
    Y=getcplmt(y)
    print("X补:",''.join(X)," -X补:",''.join(_X)," Y补:",''.join(Y))
    re=[]
    xpoint=0;ypoint=0;  #小数点处理
    if ('.' in X):
        xpoint=len(X)-1-X.index('.')
    if('.' in Y):
        ypoint=len(Y)-1-Y.index('.')
    point=xpoint+ypoint
    re=coculate(X,_X,Y)
    if(0!=point):
        re.insert(len(re)-point,'.')
    print("结果:",''.join(re))
if __name__=="__main__":
    main()

猜你喜欢

转载自blog.csdn.net/qq_36414969/article/details/83419796
今日推荐