Es gibt mehrere Probleme beim Spielen:
int
kann nur Werte zwischen -2147483648
und 2147483647
speichern. 1 << x
only verwendet die niedrigsten fünf Bits von x
. Daher ist 1 << 32
definitionsgemäß dasselbe wie 1 << 0
. 1 << 31
negativ ist. Math.pow(2, 32)
gibt eine double
zurück. (int)(d)
, wobei d
für double
größer als 2147483647
für 2147483647
steht (" der größte darstellbare Wert vom Typ int
"). Was diese Interviewfrage zeigt, zeigt, dass (int)Math.pow(2, x)
und 1 << x
für Werte von x
außerhalb des Bereichs 0
... 30
nicht gleichwertig sind.
P.S. Es ist vielleicht interessant zu bemerken, dass die Verwendung von long
anstelle von int
(und 1L
anstelle von 1
) noch eine andere Reihe von Ergebnissen ergibt, die sich von den anderen beiden unterscheiden. Dies gilt auch dann, wenn die Endergebnisse in int
konvertiert werden.
Gemäß der Dokumentation wird Math.pow
beide Argumente für eine Verdopplung und eine Rückgabe an das Doppelte fördern. Offensichtlich, wenn das zurückgegebene Ergebnis doppelt ist und Sie es in int umwandeln, erhalten Sie nur die höchsten 32 Bits und der Rest wird abgeschnitten - daher erhalten Sie immer den Wert (int) Math.pow(2,x);
. Wenn Sie Bitshift durchführen, arbeiten Sie immer mit Ints und daher tritt ein Überlauf auf.
int ist 32 Bits groß und da es (standardmäßig) signiert ist, wird das erste Bit für das Zeichen verwendet. Wenn Sie die linken 31 Bits verschieben, erhalten Sie das Two's Kompliment , welches - (2 ^ 32) ist. Wenn Sie 32 Bits nach links verschieben, wird der gesamte Weg wieder auf 1 zurückgeschleift. Wenn Sie diese Verschiebung mit Longs anstelle von Ints durchführen würden, würden Sie die Antworten bekommen, die Sie erwarten (bis Sie 63+ Bits verschieben) / p>
Tags und Links java bit-shift bitwise-operators