int getMax(int a, int b) {
int c = a - b;
int k = (c >> 31) & 0x1;
int max = a - k * c;
return max;
}
Lassen Sie uns das analysieren. Diese erste Zeile scheint unkompliziert zu sein - sie speichert den Unterschied von a
und b
. Dieser Wert ist negativ a < b
und ansonsten nicht negativ . Es gibt tatsächlich einen Fehler hier - wenn die Differenz der Zahlen a
und b
so groß ist , dass es nicht in eine ganze Zahl passt, dies zu undefinierten Verhalten führen - oops! Nehmen wir also an, dass dies hier nicht der Fall ist.
In der nächsten Zeile ist das
int k = (c >> 31) & 0x1;
Die Idee ist zu überprüfen, ob der Wert von c
negativ ist. In praktisch allen modernen Computern werden Zahlen in einem Format gespeichert, das als Zweierkomplement bezeichnet wird, wobei das höchste Bit der Zahl 0 ist, wenn die Zahl positiv ist, und 1, wenn die Zahl negativ ist. Darüber hinaus sind die meisten Ints 32 Bit. (c >> 31)
Verschiebt die Zahl um 31 Bit nach unten, wobei das höchste Bit der Zahl an der Stelle für das niedrigste Bit verbleibt. Der nächste Schritt, diese Zahl zu nehmen und mit 1 UND zu verknüpfen (deren binäre Darstellung überall außer dem letzten Bit 0 ist), löscht alle höheren Bits und gibt Ihnen nur das niedrigste Bit. Da das niedrigste Bit von c >> 31
das höchste Bit von ist c
, liest dies das höchste Bit c
entweder als 0 oder 1. Da das höchste Bit 1 c
ist, wennf 1 ist, ist dies eine Möglichkeit zu prüfen, obc
ist negativ (1) oder positiv (0). Die Kombination dieser Argumentation mit der obigen k
ist 1, wenn a < b
und andernfalls 0.
Der letzte Schritt ist dies:
int max = a - k * c;
Wenn a < b
, dann k == 1
und k * c = c = a - b
und so
a - k * c = a - (a - b) = a - a + b = b
Welches ist das richtige Maximum, da a < b
. Ansonsten wenn a >= b
, dann k == 0
und
a - k * c = a - 0 = a
Welches ist auch die richtige max.
<
.