2010-01-17 13 views
5

wie wir in Java-Variablen wissen, sind Bithalter mit einem bestimmten Typ. Und für Primitive repräsentieren die Bits einen numerischen Wert.Bitmuster (Variablenwert) für Boolean in Java?

Zum Beispiel. Ein Byte mit dem Wert 6 hat ein Bitmuster 00000110.

also wollte ich wissen, wie boolean ist auch ein primitiv, was ist das Bit-Muster für den Wert wahr und falsch.

+0

Ich bin gespannt, welche mögliche Verwendung Sie von der Antwort hoffen. –

Antwort

6

Intern im Bytecode/VM werden Boolesche Bytes mit den Bitmustern 00000001 für True und 00000000 für False dargestellt. Aber diese Informationen kaufen Sie nicht als Java-Entwickler, da Sie einfach nicht auf die numerische Repräsentation von Booleschen Werten in Java zugreifen oder diese anderweitig verwenden können, da Java sie streng von Zahlen trennt.

Edit: Ich habe gerade die Java VM Spec wieder nachgeschlagen und herausgefunden, dass meine Antwort falsch war. Im Gegensatz zu dem, was ich zuvor gesagt habe, werden Boolesche Variablen als CONSTANT_Integer-Strukturen in Byte-Code gespeichert, wodurch sie 4 Byte für Daten im Konstantenpool belegen, aber da der Konstantenpool vereinheitlicht ist, können in jeder Klasse höchstens 2 boolesche Einträge vorhanden sein. Und da ein Verweis auf den Konstantenpool immer 2 Bytes breit ist, würde ein Array von Booleschen Bytes 2 Bytes pro Eintrag im Byte-Code belegen.

3

Ja, wie skaffman sagte: Wahr ist 1 und falsch ist 0.

Aber das nicht wirklich wichtig, weil, wenn Sie bei serialisierten Daten außerhalb Ihres Programms sehen Sie unwahrscheinlich sind, jemals diese Werte sehen in der Wildnis.

Für was es wert ist, speichern gängige Java-Implementierungen Booleans in Integer-Size-Feldern tatsächlich, d. H. Sie haben 31 Null-Wert von Padding um dieses einzelne Bit der Information. Der Zugriff auf jeweils 32 Bits ist ein wenig schneller, als wenn man ein Byte aus 4 herausholt, und viel schneller als ein einzelnes Bit aus einem Byte zu graben. Diese Optimierung macht Boolesche Arrays jedoch ärgerlich groß. Wenn Sie viele, viele Bits zu bewältigen haben und den Platzbedarf reduzieren müssen, verwenden Sie besser BitSet.

2

Wenn ich nicht falsch bin, legt die JVM-Spezifikation nicht fest, wie die booleschen Werte intern dargestellt werden müssen. Wie der Wert intern dargestellt wird, ist herstellerspezifisch und spielt für den Programmierer keine Rolle, da dieses Detail für Programme, die über die JVM laufen, völlig transparent ist.

+0

Sie haben wahrscheinlich Recht. Aber was passiert, wenn Serialisierung und Kommunikation zwischen JVMs ins Spiel kommen? Unabhängig davon, wie Werte intern dargestellt werden, muss es einen verbindlichen Standard geben, damit verschiedene JVMs die booleschen (und anderen) Werte der anderen erkennen können, richtig? –

+0

Das ist ein interessanter Punkt Carl. Es muss einen verbindlichen Standard geben, wie du gesagt hast ... aber ich fürchte, ich kann das nicht kommentieren. Ich weiß es nicht – Aadith

+0

Nein, es ist nicht herstellerspezifisch - false ist 0, true ist 1. Beispiel: kompiliere diese Klasse, dekompilieren Sie es mit javap -p -c: class Test {boolean t() {return true;} boolean f() {return false;}} –