1. 程式人生 > >booth演算法(補碼一位乘) python實現

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):返回-B補碼
    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
    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.append(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=[]
    point=0
    if ('.' in X):
        point=X.index('.')
        re=coculate(X,_X,Y)
        re.insert(point,'.')
    else:
        re = coculate(X, _X, Y)
    print("結果:",''.join(re[1:]))
if __name__=="__main__":
    main()