booth演算法(補碼一位乘) python實現
阿新 • • 發佈:2018-12-17
補碼一位乘
可能表達不是特別清楚 主要還是看程式碼吧!(多多指教 謝謝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()