这是探索布尔逻辑的好机会。 在
这样的二进制加法器可以用两个“半加法器”和一个“或”完成
首先是“半加法器”。 这是异或,给出加法输出和进位。 在
[按注释编辑: python确实有作为^实现的异或,但不是像andnotor这样的“单词”。 我保持着答案。 因为它解释了二进制加法背后的布尔逻辑。”
python没有XOR,所以我们必须写一个。
XOR本身是两个AND (有反向输入)和一个OR,如下所示:
结果是简单的函数,如下。 defxor(bit_a,bit_b ) :
a1=bit_aand(notbit_b ) ) )
a2=(notbit_a ) and bit_b
返回输入(a1ora2) )。
其他人可能想这样写:
^{pr2}$
这非常有效,但我用的是布尔型的例子。 在
下一步,它具有两个输入(比特) a,比特(b ) ),并对半加alpha进行编码,以提供两个输出(加法异或(defhalf_adder ) bit_a,bit_b ) : )
return(xor ) bit_b,bit_b ),bit_a and bit_b ) ) ) ) ) ) ) return(xor ) ) ) ) 65
因此,两个“半加法器”和一个“或”构成这样的“全加法器”。
如您所见,它有三个输入(bit_a、bit_b、carry )和两个输出(sum and carry )。 在python中,情况如下: deffull_adder(bit_a,bit_b,carry=0) :
sum1,Carry1=half_adder(bit_a,bit_b ) ) ) ) ) ) ) ) sum1,Carry1=half_adder(bit_a,bit_b ) ) ) ) )
sum2,Carry2=half_adder(sum1,carry ) ) ) ) ) ) )。
返回(sum 2,carry1 or carry2) )。
如果你想把全加器看成逻辑图,它应该是这样的:
接下来,你需要调用这个全加器。 从最低有效位(LSB )开始,以0为进位,再到最高有效位(MSB ),将进位作为下一步的输入。 以下所示的4位。
结果如下。 defbinary_string_adder(bits_a,bits_b ) :
嘉莉=0
result=' '
forIinrange(Len ) bits_a )-1,-1,-1) :
summ,carry=full_adder(int(bits_a[I],int ) bits_b[I],carry ) )
结果=str (summ )
result=str (进位)
return result[:-1]
如您所见,需要反转result字符串。 这是因为构建方法“错误”。 在
将它们整理成完整的工作代码: # boolean binary string adder
dfrjust_lenght(S1,s2,fill='0' ) ) :
l1,L2=Len(S1 ),len (S2 ) ) ) ) ) ) ) ) l1,L2=Len(S1 ),len (S2 ) ) ) ) ) ) ) ) l1 ) ) ) ) L2 ) ) ) L2 ) L2 ) L2 ) L2 )
if l1 l2:
S2=S2.rjust(L1,fill ) )。
elif l2 l1:
S1=S1.rjust(L2,fill ) )。
返回(S1,s2 ) )。
efget_input(:
bits _ a=input (inputyourfirstbinarystring ) )
bits _ b=input (inputyoursecondbinarystring ) )
returnrjust_lenght(bits_a,bits_b ) )。
defxor(bit_a,bit_b ) :
a1=bit_aand(notbit_b ) ) )
a2=(notbit_a ) and bit_b
返回输入(a1ora2) )。
efhalf_adder(bit_a,bit_b ) :
return(xor ) bit_b,bit_b ),bit_a and bit_b ) ) ) ) ) ) ) return(xor ) ) ) ) 65
effull_adder(bit_a,bit_b,carry=0) :
sum1,Carry1=half_adder(bit_a,bit_b ) ) ) ) ) ) ) ) sum1,Carry1=half_adder(bit_a,bit_b ) ) ) ) )
sum2,Carry2=half_adder(sum1,carry ) ) ) ) ) ) )。
返回(sum 2,carry1 or carry2) )。
defbinary_string_adder(bits_a,bits_b ) :
嘉莉=0
result=' '
forIinrange(Len ) bits_a )-1,-1,-1) :
summ,carry=full_adder(int(bits_a[I],int ) bits_b[I],carry ) )
结果=str (summ )
result=str (进位)
return result[:-1]
戴尔主(:
bits_a,bits_b=get_input (
print(1STstringofbitsis: (,) ) )、format ) bits_a,int ) bits_a,2 ) )
print(2ndstringofbitsis: (,) )、format ) bits_b、int ) bits_b、2 ) )
result=binary _ string _ adder (bits _ a,bits_b ) ) )。
打印(summarized is : (,() ),format ) result,int ) result,2 ) )
if __name__=='__main__':
main () )
照片的两个互联网来源:
有趣的是,三行就可以完成。 其中两行实际上正在获取输入。 bits _ a=input (inputyourfirstbinarystring ) )
bits _ b=input (inputyoursecondbinarystring ) )
print((03360b ) ).format ) int ) bits_a,2 ) int ) bits_b,2 ) )
在自己的代码中,如果在第2次以后的迭代中比特为0,则设定包含上次迭代进位的x=0。 在