2015-09-08 4 views
7

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:

  1. Hat der 16 haben byte vom Typ sein, für diese zu arbeiten?
  2. 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 dem long Datentyp zu tun?)
  3. 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 ...?)
  4. 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 ...

+0

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

+1

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

+1

Keiner Ihrer vier Fragen haben etwas damit zu tun, wie Schichten unter der Haube arbeiten, also sollten Sie wahrscheinlich einen beschreibenden Titel verwenden. – harold

Antwort

2

Verwirrend ist eigentlich, dass Ihre m Variable long Typ ist, weil eine IP-Adresse 32-Bit ist und entspricht ein int. Ihre rechte Seite ist in der Tat int und wird erst nach vollständiger Berechnung auf long (64-Bit) erweitert. Beantworten Sie Ihre Fragen:

  1. Es tut es nicht. Sie können den Cast entfernen.
  2. Das Ergebnis ist tatsächlich vom Typ int, wird aber in long konvertiert, weil der Typ m es erfordert.
  3. Zwei-Komplement ist nicht wirklich auf etwas "angewendet". Die Nummer -1 ist codiert in Zweierkomplement. Sie benötigen einige Möglichkeit, negative Zahlen mit nichts als Bits darzustellen. Außerdem spielt hier das Zweierkomplement eine Nebenrolle: Es wird nur etwa -1 als alle 1-Bits codiert.
  4. Es ist alles nur ein Block von 32 Ein-Bits, die nach links verschoben werden, Nullen füllen die Lücke. Um dann zu long zu konvertieren, werden 32 weitere 1-Bits auf der linken Seite hinzugefügt.
+0

Ok, also, nächste daft Frage: Sind alle Zahlen in Java mit Zweierkomplement codiert? Wenn ja, bedeutet das, dass, während eine Ganzzahl in Java 32 Bit lang/groß ist, sie wirklich nur 31 Bits numerischer Daten enthält, und das führende Bit wird verwendet, um anzuzeigen, ob es eine positive oder eine negative Zahl ist? (I.e., ist das MSB immer das Vorzeichenbit?) – Christian

+1

Alle _signed Integers_ sind in Zweierkomplement und das ist überhaupt nicht Java-spezifisch. Es ist tatsächlich keine andere Repräsentation in Verwendung. Ich würde "numerische Daten" nicht vom Zeichen trennen, da alle 32 Bits gleichwertig dazu beitragen, 2^32 verschiedene ganze Zahlen darzustellen. –

6

Wirklich, was Datentyp ist der Compiler dies konvertieren, während es den Code ausgeführt wird, es alle Arbeit zu machen?

Diese

(-1) << (byte) 16; 

ist ein constant expression. Sein Wert ist zur Kompilierzeit bekannt. Es ist ein long mit dem Wert -65536 (in dezimaler Darstellung).

Wenn der Ausdruck kein konstanter Ausdruck war, würde der Typ der Variablen bei der Auswertung des Ausdrucks keine Rolle spielen. Es würde nur später eine Rolle spielen, wenn der Wert der Variablen zugewiesen wird.

Nehmen Sie zum Beispiel

int i = -1; 
long m = i << (byte) 16; 

Der obige Ausdruck ist eine, die einen Verschiebungsoperator und zwei Operanden beinhaltet, eine vom Typ int und ein anderer Typ von byte.

The JLS states the following concerning shift operators and their operands

Unary numerische Promotion (§5.6.1) separat auf jeden Operanden durchgeführt wird.

which is

Andernfalls, wenn der Operand der Kompilierung-Typ-Byte ist, kurz, oder char, er auf einen Wert des Typs int durch eine Verbreiterung primitive Umwandlung gefördert wird (§5.1.2) .

Also der byte Wert wird zu einem int erweitert. Also nein zu deiner ersten Frage. Das Ergebnis des Ausdrucks wäre ein Wert vom Typ int (32 Bits). Es muss einer long (64 Bit) Variablen zugewiesen werden, so dass der Wert widened to a long vor der Zuweisung wäre.

Vom JLS again

Die integralen Typen sind byte, short, int, und langen, deren Werte sind 8-bit, 16-bit, 32-bit und 64-bit signierte Zweierkomplement- Integer, bzw. char, deren Werte vorzeichenlose 16-Bit-Ganzzahlen sind, die UTF-16-Code-Einheiten darstellen (§3.1).

So sind sie gespeichert.

+0

Nitpick: Du scheinst dir selbst zu widersprechen. "Das Ergebnis des Ausdrucks ist ein Wert vom Typ int" und "Es ist ein langer Wert". – Taemyr

+0

@Taemyr besser? –

+0

Also, in weniger akademischen Begriffen, die Zahlen auf beiden Seiten sind "int", aber - weil es eine Operation auf der Bit-Ebene ist - betrachten wir ihre Bit-Werte/Darstellungen? Und weil eine Ganzzahl in Java 32 Bits ist, und dank des Zweierkomplements, "-1" ergibt 32 '1' Bits (wenn wir auf seine Bit-Darstellung schauen)? – Christian

Verwandte Themen