python - 二进制加法时如何进位?

标签 python recursion binary addition

代码:

def add_bitwise(b1, b2):
    '''Adds two binary numbers.'''
    if b1 == '':
        return b2
    elif b2 == '':
        return b1
    else:
        sum_rest = add_bitwise(b1[:-1],b2[:-1])
        if b1[-1] == '0' and b2[-1] == '0':
            return sum_rest + '0'
        elif b1[-1] == '1' and b2[-1] == '0':
            return sum_rest + '1'
        elif b1[-1] == '0' and b2[-1] == '1':
            return sum_rest + '1'
        elif b1[-1] == '1' and b2[-1] == '1':
            return sum_rest + add_bitwise(b2[:-1],'1') + '0'    

所以我必须使这个函数接受两个二进制数并将它们相加。这必须使用递归来完成,并且不能将数字转换为十进制、相加然后转换回二进制。所以我的基本情况是,如果一个二进制数为空,则返回另一个,反之亦然。然后,对于我的递归调用,如果添加两个零,它将返回 0 和递归调用。如果添加 0 和 1,则会添加 1 和递归调用。

现在我被困住了。两个 1 等于 0,然后你必须将 1 带到下一侧,但我不知道如何在第二个递归调用中执行此操作。 Sum rest 是正常的递归调用,然后在递归调用后面携带数字,然后是 0。函数必须保持设计不变,但需要修复递归调用。

最佳答案

溢出会转移到结果的高位数字,而不仅仅是一个数字。溢出递归必须对整个 sum_rest 求和 '1',而不是 b2[:-1]

这是一个稍微简短的实现:

def bin_add(bin1: str, bin2: str) -> str:
    # bin1 or bin2 is empty, just use the non-empty one
    if not bin1 or not bin2:
        return bin1 + bin2   # '' + '1' or '1' + '' => '1'
    # split computation into the
    # "current/lowest digit" and "higher digits"
    head = bin_add(bin1[:-1], bin2[:-1])
    # simple case: no overflow at the current digit
    if bin1[-1] == '0':  # 0+1 or 0+0
        return head + bin2[-1]
    if bin2[-1] == '0':  # 1+0
        return head + '1'
    # overflow: add '1' to higher digits
    return bin_add(head, '1') + '0'

例如,考虑二进制文件 '011''110'。人们可以手动执行以下操作:

  • 0 + 1 => 1,保留1,不溢出
  • 1 + 1 => 10,保留 0,溢出
  • 0 + 1 + 1 => 10,保留 0,溢出
  • /+/+ 1 => 1,保留1,不溢出

关于python - 二进制加法时如何进位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40010655/

相关文章:

function - 函数调用自身以枚举嵌套的组成员身份

javascript - 如何显示数字中最大的数字 - javascript

在 C 中将无符号整数转换为 48 位二进制

c++ - 从文件中读取多个字节并存储它们以便在 C++ 中进行比较

python - 带有用 Python 编写的 FCGI 的 HTTP Web 服务器?

python - 多线程 Numpy 插入

python - 如何减去 Pandas 中的两个 DataFrame 列

python - 如何在使用 pandas [Python] 提取 xls 文件后从输出中删除编号

recursion - 最长递增子序列递归版本

c - 如何将大十进制值转换为二进制