这段代码中的while循环如何工作?

时间:2016-08-15 19:00:23

标签: swift

我正在尝试在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
}

感谢您的帮助。

2 个答案:

答案 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)
}