不赞成进位的二进制加法
Binary addition which disapproves carrying
我目前正在使用二进制加法,如果有进位,returns False。我当前的代码是:
def binaryadd(one, other):
str_1, str_2 = str(one), str(other)
for a,b in zip(str_1[::-1], str_2[::-1]):
if a == b == '1':
return False
return int(bin(rev_bin(one) + rev_bin(other))[2:])
所以 10111 + 1000 会 return 11111,10110 + 1011 会 return 错误。我认为会有更有效的代码;例如另外检查溢出,但我想知道哪些代码可以做到这一点。有没有更好的方法呢?
从存在 "column" 的那一刻开始,两个操作数都有一个 1
,因为在这种情况下我们 生成 一个进位。进位也可以传播,但前提是已经生成了进位。
我们可以用位与 (&
) 来检查这一点。如果没有进位,我们可以按位或 (|
):
def binaryadd(one, other):
if <b>one & other</b>:
return False
return <b>one | other</b>
或单行:
def binaryadd(one, other):
return not bool(one & other) and one | other
我目前正在使用二进制加法,如果有进位,returns False。我当前的代码是:
def binaryadd(one, other):
str_1, str_2 = str(one), str(other)
for a,b in zip(str_1[::-1], str_2[::-1]):
if a == b == '1':
return False
return int(bin(rev_bin(one) + rev_bin(other))[2:])
所以 10111 + 1000 会 return 11111,10110 + 1011 会 return 错误。我认为会有更有效的代码;例如另外检查溢出,但我想知道哪些代码可以做到这一点。有没有更好的方法呢?
从存在 "column" 的那一刻开始,两个操作数都有一个 1
,因为在这种情况下我们 生成 一个进位。进位也可以传播,但前提是已经生成了进位。
我们可以用位与 (&
) 来检查这一点。如果没有进位,我们可以按位或 (|
):
def binaryadd(one, other):
if <b>one & other</b>:
return False
return <b>one | other</b>
或单行:
def binaryadd(one, other):
return not bool(one & other) and one | other