web-dev-qa-db-fra.com

En Java, puis-je définir une constante entière au format binaire?

Semblable à la façon dont vous pouvez définir une constante entière en hexadécimal ou octal, puis-je le faire en binaire?

J'admets que c'est une question vraiment facile (et stupide). Mes recherches Google sont vides.

84
Aaron Fi

Donc, avec la sortie de Java SE 7, la notation binaire est standard. La syntaxe est assez simple et évidente si vous avez une compréhension décente du binaire:

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

Et spécifiquement sur le point de déclarer des variables de niveau classe comme binaires, il n'y a absolument aucun problème à initialiser une variable statique en utilisant la notation binaire:

public static final int thingy = 0b0101;

Faites juste attention à ne pas déborder les chiffres avec trop de données, sinon vous obtiendrez une erreur de compilation:

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

Maintenant, si vous voulez vraiment avoir de la fantaisie, vous pouvez combiner cette autre nouvelle fonctionnalité intéressante dans Java 7 connu sous le nom de littéraux numériques avec des traits de soulignement. Jetez un œil à ces exemples fantaisistes de notation binaire avec des traits de soulignement littéraux :

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

N'est-ce pas agréable et propre, pour ne pas mentionner très lisible?

J'ai extrait ces extraits de code d'un petit article que j'ai écrit sur le sujet sur TheServerSide. N'hésitez pas à le consulter pour plus de détails:

Java 7 et notation binaire: maîtrise de l'OCP Java Programmer (OCPJP) Exam

64
Cameron McKenzie

Dans Java 7:

int i = 0b10101010;

Il n'y a pas de littéraux binaires dans les anciennes versions de Java (voir les autres réponses pour les alternatives).

152
Russ Hayward

Il n'y a pas de littéraux binaires en Java, mais je suppose que vous pourriez le faire (même si je ne vois pas l'intérêt):

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

La réponse d'Ed Swangren

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

fonctionne bien. J'ai utilisé long au lieu de int et j'ai ajouté les modificateurs pour clarifier l'utilisation possible comme masque de bits. Il y a cependant deux inconvénients à cette approche.

  1. La saisie directe de tous ces zéros est sujette aux erreurs
  2. Le résultat n'est pas disponible au format décimal ou hexadécimal au moment du développement

Je peux suggérer une approche alternative

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

Cette expression montre clairement que le 12e bit est 1 (le décompte commence à 0, de droite à gauche); et lorsque vous passez le curseur de la souris, l'info-bulle

long YourClassName.mask12 = 4096 [0x1000]

apparaît dans Eclipse. Vous pouvez définir des constantes plus compliquées comme:

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

ou explicitement

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

La valeur de la variable maskForSomething sera toujours disponible dans Eclipse au moment du développement.

18
chgman

Utiliser des constantes binaires pour masquer

Déclarez les constantes:

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;

et les utiliser

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

Recherchez "syntaxe des littéraux Java" sur Google et vous obtenez quelques entrées.

Il existe une syntaxe octale (préfixez votre numéro avec 0), une syntaxe décimale et une syntaxe hexadécimale avec un préfixe "0x". Mais pas de syntaxe pour la notation binaire.

Quelques exemples:

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

Si vous voulez jouer avec beaucoup de binaires, vous pouvez définir quelques constantes:

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

etc.

ou

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

Réponse un peu plus maladroite:

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

}

qui génère [Java] bb doit être égal à 2, la valeur est "2"

0
NSherwin