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


85

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

Ammetto che questa sia una domanda davvero facile (e stupida). Le mie ricerche su Google risultano vuote.


2
Per tua informazione, praticamente in tutti i linguaggi di programmazione, l'idioma è scrivere costanti binarie in esadecimale e non la stringa binaria effettiva.
abyx

3
Giusto, ma immagino sia perché hex è la cosa più vicina disponibile, non perché ci sia qualcosa di sbagliato in binary. Nei linguaggi che ho usato che supportano i letterali binari, non credo che la convenzione sia quella di ignorare questa funzionalità.
Ken


Anno 2017: la risposta accettata deve essere quella fornita da Russ. Vedi: stackoverflow.com/a/1692932/716079
Lourenco

Risposte:


65

Quindi, con il rilascio di Java SE 7, la notazione binaria diventa uno standard fuori dagli schemi. La sintassi è abbastanza semplice e ovvia se hai una discreta 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 le variabili a livello di classe come binari, non c'è assolutamente alcun problema a inizializzare una variabile statica usando la notazione binaria:

public static final int thingy = 0b0101;

Fai solo attenzione a non sovraccaricare i numeri con troppi dati, altrimenti riceverai un errore del compilatore:

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

Ora, se vuoi davvero essere fantasioso, puoi combinare quell'altra nuova bella funzionalità in Java 7 nota come letterale numerico con trattini bassi. Dai un'occhiata a questi fantasiosi esempi di notazione binaria con trattini bassi 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 parlare dell'elevata leggibilità?

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

Java 7 e notazione binaria: padronanza dell'esame OCP Java Programmer (OCPJP)


3
Perché i tuoi dati in byte = 0b0000110011; ha 10 bit? Sono nuovo nella programmazione ma penso che dovrebbe assomigliare a 0b00110011 per adattarsi a 8 bit di tipo di dati byte.
Mike

1
Per chiunque si chieda la stessa cosa di Mike, è perché il compilatore lo converte nel numero che rappresenta: potresti avere decine di zeri iniziali e non influenzeranno il valore effettivo. Il processo di compilazione è essenzialmente lo stesso come se avessi scritto un decimale lì.
Luke Briggs

1
per definizione il tipo primitivo byte può memorizzare 256 numeri tra -128 e 127 (-128 a -1 e 0 a 127). Ma come rappresentare -128 usando un letterale binario. per es. byte b = -0b1111111; indica -127 ma che dire di -128?
nirmalsingh

152

In Java 7:

int i = 0b10101010;

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


33
Vorrei anche sottolineare che possono esserci _caratteri per rendere la sequenza più leggibile: int i = 0b1010_1010_0011;
user12345613

@Russ Cosa significa 0b qui? Come viene chiamata questa funzione in Java 7?
Geek

1
0b significa binario. La funzione si chiama letterali binari: docs.oracle.com/javase/7/docs/technotes/guides/language/…
Russ Hayward,

1
Adoro questa nuova rappresentazione di dati binari. La rappresentazione della stringa sarebbe molto difficile da leggere. Guarda la differenza tra la risposta accettata e quella tra "@ user12345613". +1 per lui.
Marcello de Sales

54

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

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

1
Tra gli altri usi, il modello di punteggiatura per la rasterizzazione di linee e poligoni è specificato come numero intero in diverse librerie grafiche popolari. L'uso di parseInt o parseShort consente allo sviluppatore di visualizzare facilmente il pattern.
charstar

5
A partire da Java 7, la risposta di Russ Hayward è la risposta corretta. Prima di Java 7, puoi utilizzare uno strumento online o la tua calcolatrice preferita per convertire il binario in una delle notazioni riconosciute dalle vecchie versioni di Java (ottale, decimale o esadecimale). Se viene utilizzata un'altra radice, un commento descrittivo contenente la rappresentazione binaria può essere inserito nella dichiarazione per chiarire il valore per i lettori.
Jason C

Questa è una soluzione piuttosto sporca, non è vero? Stai solo prendendo 16 byte per rappresentare 1 byte (senza contare il secondo argomento e la conversione). Ovviamente, a meno che il compilatore non lo ottimizzi, cosa che dubito.
Tomáš Zato - Ripristina Monica il

@ TomášZato: Sì, lo è, ma quale soluzione suggeriresti dato che la lingua non supportava i letterali binari quando ho scritto questa risposta? Russ Hayward dovrebbe avere la risposta accettata ora.
Ed S.

Suggerirei di rinunciare al comfort e di utilizzare numeri interi. Nella definizione stessa della variabile, va bene, ma questa risposta potrebbe motivare gli utenti a utilizzare questo approccio per i loop, ecc. E in generale, penso che il programmatore dovrebbe cercare di rinunciare al proprio comfort per alcune prestazioni.
Tomáš Zato - Ripristina Monica il

18

La risposta di Ed Swangren

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

funziona bene. Ho usato longinvece di inte aggiunto i modificatori per chiarire il possibile utilizzo come maschera di bit. Tuttavia, ci sono 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 evidente che il 12 ° bit è 1 (il conteggio parte da 0, da destra a sinistra); e quando passi il cursore del mouse, la descrizione comando

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 maskForSomethingsarà ancora disponibile in Eclipse al momento dello sviluppo.


Ottima soluzione! (maschera lunga statica finale pubblica12 = 1L << 12;)
Jyro117

16

Utilizzo di costanti binarie per mascherare

Dichiara 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
}

12

Cerca "sintassi letterale Java" su Google e ottieni alcune voci.

C'è una sintassi ottale (anteponi il tuo numero con 0), sintassi decimale e sintassi esadecimale con un prefisso "0x". Ma nessuna sintassi per la notazione binaria.

Qualche esempio:

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

1
Questo non risponde alla domanda.
Michael McQuade

Anno 2017: fortunatamente esiste la notazione per la rappresentazione binaria. Inizia con "0b". Esempio: byte b = 0b01000001(per una migliore lettura byte b = 0b0100_0001).
Lourenco

2

Se vuoi scherzare con un sacco di binari, potresti definire alcune 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;

0

Risposta leggermente più imbarazzante:

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"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.