2016-08-15 2 views
0

Ich versuche, ein problem auf LeetCode zu vervollständigen, und ich habe diese Lösung in Swift gefunden, aber ich bin wirklich nicht sicher, was in dieser while-Schleife des Codes geschieht:Wie funktioniert die While-Schleife in diesem Code?

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 
} 

Vielen Dank für jede Hilfe.

+1

http://javarevisited.blogspot.com/2013/06/how-to-add-two-integer-numbers-without-plus-arithmetic-operator-java-example.html – Alexander

Antwort

2

(a, b) = (a^b, (a & b) << 1) macht eine Tupel-Zuweisung. Es kann in unterteilt werden:

let oldA = a 
let oldB = b 
a = oldA^oldB 
b = (oldA & oldB) << 1 

^ ist das Bit-wist Exklusiv-Oder (XOR) Operator in Swift (und die meisten C-ähnlichen Sprachen) & die bitweise ist und (AND) Operator in Swift (und die meisten C-ähnlichen Sprachen)

<< ist der linke Bit-Shift-Operator. x << 1 bedeutet „Bit-Shift-x nach links um 1“

+3

Aber beachten Sie, dass Splitting Die Operation in zwei Zeilen wird etwas anderes tun, da die zweite Zeile den bereits aktualisierten "a" -Wert verwendet, nicht den ursprünglichen. – luk2302

+0

Das ist ein wirklich guter Punkt, ich habe mich gefragt, warum es so gemacht wurde! – Alexander

2

Als Ergänzung zu @Alexander Momchliov's answer -die die bitweise Operatoren verwendet Note auch erklärt, dass Sie nicht wandelbar lokalen Bereich Variablen und eine while Schleife in der getSum(...) verwenden müssen Funktion, aber kann die gleichen Bit-Operator-Berechnungen in rekursiven Aufrufe der Funktion selbst, z

func getSum(a: Int, _ b: Int) -> Int { 
    if b == 0 { return a } 
    return getSum(a^b, (a & b) << 1) 
} 
+0

Meiner Meinung nach wäre 'if b == 0 {return a}' besser verständlich. Ich verstehe nicht, warum Leute versuchen, * alle * vorzeitigen Rückgaben durch 'Wächter' zu ersetzen. - Nur meine 2ct! –

+0

@MartinR nach Ihrer Aufforderung, stimme ich zu! Ich bin, wie viele, von der Früh-Rückkehr-'guard'-Grippe infiziert! Vielen Dank :) – dfri

Verwandte Themen