python - 仅使用按位运算符的两个数字的总和?

标签 python bit-manipulation bitwise-operators

我的问题是,如何在不使用 bool、if-else 条件或逻辑运算符的情况下将两个数字相加?

我一直在尝试编写一个在Python中将两个数字相加的代码,但仅使用按位运算符;换句话说,没有循环、if-else 和算术运算符。

我也一直在查看此页面和其他编程站点,但此问题的所有解决方案都有 while 循环或 if-else 条件。我找到了一个假设的解决方案,它 本来以为它是递归地完成的,但它产生了一个递归错误:超出了递归的最大深度。因为它没有基本情况

现在我问自己,是否可以做到这一点。那么另一个问题是,这可能吗?如果是的话,我该怎么做?

这是我失败的代码:

x=7
y=2
def Sum(x, y):
    suma=x^y
    carry=(x&y)<<1
    return Sum(suma, carry)
print(Sum(x, y))

最佳答案

您在评论中说输入不得大于 10^5。在这种情况下,有限数量的进位传播步骤足以消除进位项并产生最终的和:

def binop_add(x, y):
    sum, carry = x, y
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 1
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 2
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 3
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 4
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 5
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 6
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 7
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 8
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 9
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 10
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 11
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 12
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 13
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 14
    sum, carry = (sum ^ carry), (sum & carry) << 1 # 15
    # assert carry == 0
    return sum

每轮sum, carry = (sum ^ carry), (sum & carry) << 1保留 sum + carry == x + y 的不变量。每轮结束后,carry必须至少多一个 0 位结束。

15轮后,carry必须以至少 15 个零位结束。对于 carry此时为非零,carry必须至少是 1 << 15 ,即 32768,高于可能值。此时,carry必须为 0,所以 sum + carry == sum == x + y ,我们返回sum .

关于python - 仅使用按位运算符的两个数字的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52339523/

相关文章:

python - Tkinter 文本小部件比任何其他带有网格的小部件更宽

Python 列表迭代问题

python - 为什么 Python 中的单元测试需要 -m 选项?

c# - 如何使用按位运算符和枚举生成动态表达式?

c++ - 使用按位运算与相邻像元值确定像元值

algorithm - 具有最大尾随零位数的区间中的整数

c - C语言中如何反转位运算

python - 使用 datetime.datetime 在 python 中从用户获取输入日期

c - 如何对变量进行位移并形成整个值

c - 如何在没有 * 或 - 运算符的情况下否定 C 中的正整数?