【发布时间】:2019-12-26 16:02:13
【问题描述】:
我目前正在使用 python 进行“编程面试要素”,并且已经在这部分卡住了 3 天。下面的代码只是简单地将两个数字相乘而不使用任何运算符;作者给出的解释如下:
“小学教的十进制乘法算法确实 不要使用重复的加法——它使用 shift 和 add 来实现很多 更好的时间复杂度。我们可以对二进制数做同样的事情-to 将 x 和 y 相乘,我们将结果初始化为 0 并遍历 x 的位,如果 r 的第 k 位为 1,则将 2ky 添加到结果中。 值 (2^k)*y 可以通过将 y 左移 k 来计算。既然我们不能 直接使用add,我们必须实现它。我们申请小学 二进制情况的加法算法,即计算总和 一点一点,并“涟漪”随身携带。”
def multiply(x, y):
def add(a, b):
running_sum, carryin, k, temp_a, temp_b = 0, 0, 1, a, b
while temp_a or temp_b:
ak, bk = a & k, b & k
carryout = (ak & bk) | (ak & carryin) | (bk & carryin)
running_sum |= ak ^ bk ^ carryin
carryin, k, temp_b, temp_b = (
carryout << 1, k << 1, temp_a >> 1, temp_b >> 1)
return running_sum | carryin
running_sum = 0
while x: # Examines each bit of x
if x & 1:
running_sum = add(running_sum, y)
x, y = x >> 1, y << 1
return running_sum
print(multiply(2, 2))
我的问题是:
- 变量“ak”和“bk”的用途是什么
- 进位变量发生了什么;为什么我们对 (ab & bk, ak & carry and bk & carryin) 使用按位与运算符,然后使用按位或?
- 变量“running_sum”如何使用按位异或和按位或来跟踪总和?
- 我们为什么要返回“running_sum | carryin”
如果能帮助您理解此代码,我们将不胜感激。提前致谢。
【问题讨论】:
标签: python python-3.x algorithm bit-manipulation bitwise-operators