我正在尝试在LeetCode上完成problem,我在Swift中找到了这个解决方案,但我真的不确定在这个代码的while循环中会发生什么:
func getSum(a: Int, _ b: Int) -> Int {
var a = a
var b = b
while b != 0 {
(a, b) = (a ^ b, (a & b) << 1)
}
return a
}
感谢您的帮助。
答案 0 :(得分:2)
(a, b) = (a ^ b, (a & b) << 1)
正在进行元组分配。它可以分解为:
let oldA = a
let oldB = b
a = oldA ^ oldB
b = (oldA & oldB) << 1
^
是Swift中的bit-wist独占或(XOR)运算符(和大多数类C语言一样)
&
是Swift中的按位和(AND)运算符(以及大多数类C语言)
<<
是左移位运算符。 x << 1
表示“将x向左移位1”
答案 1 :(得分:2)
作为@Alexander Momchliov's answer的补充 - 它解释了所使用的逐位运算符 - 请注意,您不需要在while
函数中使用可变局部范围变量和getSum(...)
循环,但是可以在对函数本身的递归调用中使用相同的位运算符计算,例如
func getSum(a: Int, _ b: Int) -> Int {
if b == 0 { return a }
return getSum(a ^ b, (a & b) << 1)
}