Ich studierte nicht IT, und erst vor kurzem stieß bit shifts und eine Anwendung für two's complement. Kannst du bitte in deinen Erklärungen einfaches Englisch verwenden und davon ausgehen, dass ich kaum etwas über IP-Adressen, Bit-Operationen und Java-Datentypen weiß?Wie arbeitet der Bit-Shift-Operator von Java unter der Haube?
Heute fand ich das folgende Stück Code (kurz):
long m = (-1) << (byte) 16;
Nun, dies ist für IP-Subnetz Maskierung. Ich weiß, dass ich mit 4 Blöcken von 8 Bits (d. H. 4 Bytes) beginnen muss, und alle Bits müssen "eingeschaltet" sein: 11111111 11111111 1111111 1111111
Als nächstes werden Nullen von rechts nach rechts geschoben, in diesem Fall 16 Bit; so erhalten wir 11111111 11111111 00000000 0000000
, die Maske.
Aber ich habe ein paar Fragen:
- Hat der
16
habenbyte
vom Typ sein, für diese zu arbeiten? - Das Ergebnis ist vom Typ
long
. Wenn der obige Ausdruck ausgeführt wird, wird-1
in - effektiv - 4x8bit-Blöcke konvertiert. Wie weiß Java, dass es 32 Positionen/Bits (die Länge einer IP-Adresse) benötigt, und nicht etwa 16 oder 8, wenn das Zweierkomplement angewendet wird? (Ich vermute, das hat mit demlong
Datentyp zu tun?) - Warum wird Zweierkomplement auf
-1
angewendet, um mit zu beginnen? (Google gibt Ihnen-0b1
, wenn Sie es fragen, welche-1
binär ist. Ich dachte zuerst könnte es mit Überlauf zu tun, aber es ist nicht, ist es ...?) - Wirklich, was Datentypen funktioniert der Compiler convert dies, während es den Code ausführt, damit alles funktioniert?
UPDATE: Die 16
durch ein Verfahren zur Laufzeit erzeugt wird; Ich habe hier nur eine Konstante als Beispiel angeführt. Im Nachhinein wahrscheinlich eine schlechte Idee ...
Ein 32-Bit-Wert würde in ein Register passen, und der Bitverschiebungsvorgang würde typischerweise vom Prozessor selbst ausgeführt, etwas, das in der Baugruppe wie "shl AX, 16" aussehen würde. Auf dieser Ebene gibt es nicht wirklich Datentypen. Sie haben Blöcke von 8, 16, 32 oder 64 Bits erhalten. – GolezTrol
32 Bits haben fast definitiv mehr damit zu tun, dass Int 32 Bit breit ist als die Länge einer IP (auch soweit ich mich erinnere, wenn Bitshifting in Java alles automatisch nach int propagiert) – Luke
Keiner Ihrer vier Fragen haben etwas damit zu tun, wie Schichten unter der Haube arbeiten, also sollten Sie wahrscheinlich einen beschreibenden Titel verwenden. – harold