In Java, posso definire una costante intera in formato binario?

Simile a come è ansible definire una costante intera in esadecimale o ottale, posso farlo in binario?

Ammetto che questa è una domanda davvero facile (e stupida). Le mie ricerche su google stanno arrivando vuote.

Quindi, con il rilascio di Java SE 7, la notazione binaria viene fornita come standard. La syntax è abbastanza semplice ed evidente se si ha una buona comprensione del binario:

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

E in particolare sul punto di dichiarare variabili di livello di class come binari, non c’è assolutamente alcun problema nell’iniziare una variabile statica usando la notazione binaria:

 public static final int thingy = 0b0101; 

Basta fare attenzione a non sovraccaricare i numeri con troppi dati, altrimenti si otterrà un errore del compilatore:

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

Ora, se vuoi davvero essere fantasioso, puoi combinare l’altra nuova e pulita funzionalità di Java 7, nota come letterali numerici con caratteri di sottolineatura. Dai un’occhiata a questi fantastici esempi di notazione binaria con caratteri di sottolineatura letterali:

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

Ora non è così bello e pulito, per non dire altamente leggibile?

Ho estratto questi frammenti di codice da un piccolo articolo che ho scritto sull’argomento su TheServerSide. Sentiti libero di darci un’occhiata per maggiori dettagli:

Java 7 e notazione binaria: masterizzazione dell’esame OCP Java Programmer (OCPJP)

In Java 7:

 int i = 0b10101010; 

Non ci sono letterali binari nelle versioni precedenti di Java (vedi altre risposte per le alternative).

Non ci sono letterali binari in Java, ma suppongo che si possa fare questo (anche se non vedo il punto):

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

La risposta di Ed Swangren

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

funziona bene. Ho usato long invece di int e aggiunto i modificatori per chiarire il ansible utilizzo come maschera di bit. Ci sono, tuttavia, due inconvenienti con questo approccio.

  1. La digitazione diretta di tutti quegli zeri è soggetta a errori
  2. Il risultato non è disponibile in formato decimale o esadecimale al momento dello sviluppo

Posso suggerire un approccio alternativo

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

Questa espressione rende ovvio che il 12 ° bit è 1 (il conteggio inizia da 0, da destra a sinistra); e quando si posiziona il cursore del mouse, il suggerimento

 long YourClassName.mask12 = 4096 [0x1000] 

appare in Eclipse. Puoi definire costanti più complicate come:

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

o esplicitamente

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

Il valore della variabile maskForSomething sarà comunque disponibile in Eclipse in fase di sviluppo.

Usare costanti binarie per mascherare

Dichiarare le costanti:

 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; 

e usali

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

Cerca la “syntax dei letterali Java” su Google e ottieni alcune voci.

C’è una syntax ottale (prefisso il numero con 0), la syntax decimale e la syntax esadecimale con un prefisso “0x”. Ma nessuna syntax per la notazione binaria.

Qualche esempio:

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

Se vuoi fare un po ‘di binari puoi definire delle costanti:

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

eccetera.

o

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

Risposta leggermente più scomoda:

 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() + "\"" ); } } 

quale output [java] bb dovrebbe essere 2, il valore è “2”