Kann ich in Java eine Integer-Konstante im Binärformat definieren?

Ähnlich wie Sie eine Integer-Konstante in Hexadezimal oder Oktal definieren können, kann ich es in Binärform tun?

Ich gebe zu, das ist eine wirklich einfache (und dumme) Frage. Meine Google-Suche wird leer ausgehen.

Mit der Veröffentlichung von Java SE 7 kommt die Binärnotation daher standardmäßig zum Einsatz. Die Syntax ist ziemlich geradlinig und offensichtlich, wenn Sie ein gutes Verständnis von binär haben:

byte fourTimesThree = 0b1100; byte data = 0b0000110011; short number = 0b111111111111111; int overflow = 0b10101010101010101010101010101011; long bow = 0b101010101010101010101010101010111L; 

Und speziell im Hinblick darauf, Variablen auf classnebene als Binärdateien zu deklarieren, gibt es überhaupt kein Problem, eine statische Variable in binärer Notation zu initialisieren:

 public static final int thingy = 0b0101; 

Achten Sie darauf, die Zahlen nicht mit zu vielen Daten zu überfüllen, sonst erhalten Sie einen Compilererrors:

 byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte 

Nun, wenn Sie wirklich Lust haben wollen, können Sie dieses andere nette neue Feature in Java 7, bekannt als numerische Literale mit Unterstrichen, kombinieren. Sehen Sie sich diese fantastischen Beispiele für Binärnotation mit Literalunterstrichen an:

 int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011; long bow = 0b1__01010101__01010101__01010101__01010111L; 

Ist das nicht schön und sauber, nicht zu vergessen, gut lesbar?

Ich habe diese Codeschnipsel aus einem kleinen Artikel, den ich über das Thema geschrieben habe, bei TheServerSide gelesen. Fühlen Sie sich frei, es für weitere Details zu überprüfen:

Java 7 und binäre Notation: Beherrschung der OCP Java Programmer (OCPJP) Prüfung

In Java 7:

 int i = 0b10101010; 

In älteren Versionen von Java gibt es keine Binärliterale (weitere Antworten finden Sie unter Alternativen).

Es gibt keine binären Literale in Java, aber ich nehme an, dass Sie dies tun könnten (obwohl ich den Punkt nicht sehe):

 int a = Integer.parseInt("10101010", 2); 

Die Antwort von Ed Swangren

 public final static long mask12 = Long.parseLong("00000000000000000000100000000000", 2); 

funktioniert gut. Ich habe long anstelle von int und die Modifikatoren hinzugefügt, um die mögliche Verwendung als Bitmaske zu verdeutlichen. Es gibt jedoch zwei Unannehmlichkeiten bei diesem Ansatz.

  1. Die direkte Eingabe all dieser Nullen ist errorsanfällig
  2. Das Ergebnis ist zum Zeitpunkt der Entwicklung nicht im Dezimal- oder Hexadezimalformat verfügbar

Ich kann einen alternativen Ansatz vorschlagen

 public final static long mask12 = 1L < < 12; 

Dieser Ausdruck macht es offensichtlich, dass das 12. Bit 1 ist (die Zählung beginnt bei 0, von rechts nach links); und wenn Sie den Mauszeiger bewegen, den Tooltip

 long YourClassName.mask12 = 4096 [0x1000] 

erscheint in Eclipse. Sie können kompliziertere Konstanten definieren wie:

 public final static long maskForSomething = mask12 | mask3 | mask0; 

oder explizit

 public final static long maskForSomething = (1L< <12)|(1L<<3)|(1L<<0); 

Der Wert der Variablen maskForSomething steht zur Entwicklungszeit weiterhin in Eclipse zur Verfügung.

Verwenden von binären Konstanten zum Maskieren

Deklariere Konstanten:

 public static final int FLAG_A = 1 < < 0; public static final int FLAG_B = 1 << 1; public static final int FLAG_C = 1 << 2; public static final int FLAG_D = 1 << 3; 

und benutze sie

 if( (value & ( FLAG_B | FLAG_D )) != 0){ // value has set FLAG_B and FLAG_D } 

Suchen Sie auf Google nach “Java Literals Syntax” und Sie erhalten einige Einträge.

Es gibt eine oktale Syntax (Präfix der Zahl mit 0), Dezimal-Syntax und hexadezimale Syntax mit einem Präfix “0x”. Aber keine Syntax für die binäre Notation.

Einige Beispiele:

 int i = 0xcafe ; // hexadecimal case int j = 045 ; // octal case int l = 42 ; // decimal case 

Wenn Sie mit vielen Binärdateien herumspielen möchten, können Sie einige Konstanten definieren:

 public static final int BIT_0 = 0x00000001; public static final int BIT_1 = 0x00000002; 

etc.

oder

 public static final int B_00000001 = 0x00000001; public static final int B_00000010 = 0x00000002; public static final int B_00000100 = 0x00000004; 

Etwas peinlichere Antwort:

 public class Main { public static void main(String[] args) { byte b = Byte.parseByte("10", 2); Byte bb = new Byte(b); System.out.println("bb should be 2, value is \"" + bb.intValue() + "\"" ); } } 

welche Ausgänge [java] bb sollte 2 sein, Wert ist “2”