补码一位乘
可能表达不是特别清楚 主要还是看代码吧!(多多指教 谢谢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()