输入
- 命令行参数规范如下:
$ python3 binary_sum.py <binary ...>
<binary ...>
:2~7个二进制数,取值范围为0b1~0b1111111111111,最大13 位。- 【提示】
sys.argv
是字符串数组,中间以空格分隔。
输出
- 按照二进制形式将计算结果输出至
stdout
,范例如下:
$ python3 sum.py 101 110 1011
$ python3 sum.py 1000000001110 10111101100 1010111111010
$ python3 sum.py 1000000001110 10111101100 101 110 1011000000101
我们可以设计这样的算法来计算:
把 aa 和 bb 转换成整型数字 xx 和 yy,在接下来的过程中,xx 保存结果,yy 保存进位。
当进位不为 00 时
计算当前 xx 和 yy 的无进位相加结果:answer = x ^ y
计算当前 xx 和 yy 的进位:carry = (x & y) << 1
完成本次循环,更新 x = answer,y = carry
返回 xx 的二进制形式
为什么这个方法是可行的呢?在第一轮计算中,answer 的最后一位是 xx 和 yy 相加之后的结果,carry 的倒数第二位是 xx 和 yy 最后一位相加的进位。接着每一轮中,由于 carry 是由 xx 和 yy 按位与并且左移得到的,那么最后会补零,所以在下面计算的过程中后面的数位不受影响,而每一轮都可以得到一个低 ii 位的答案和它向低 i + 1i+1 位的进位,也就模拟了加法的过程。
代码如下:
import sys
def binary_sum(a, b) -> str:
x, y = int(a, 2), int(b, 2)
while y:
answer = x ^ y #add with no carry
carry = (x & y) << 1 #digitwise AND operation and left shift
x, y = answer, carry
return bin(x)[2:]
def add(argv):
temp = "0"
for i in range(1, len(argv)):
temp = binary_sum(temp, argv[i])
return temp
print(add(sys.argv))