87 votes

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

Tout comme vous pouvez définir une constante entière en hexadécimal ou en octal, puis-je le faire en binaire ?

2 votes

Just FYI, dans presque tous les langages de programmation, l'idiome est d'écrire des constantes binaires en hexadécimal, et non la chaîne binaire réelle.

3 votes

D'accord, mais j'imagine que c'est parce que l'hexadécimal est la chose la plus proche disponible, pas parce qu'il y a quelque chose de mal avec le binaire. Dans les langages que j'ai utilisés qui prennent en charge les littéraux binaires, je ne pense pas que la convention soit d'ignorer cette fonctionnalité.

153voto

Russ Hayward Points 3636

En Java 7 :

int i = 0b10101010;

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

33 votes

Je tiens également à souligner qu'il peut y avoir des caractères _ pour rendre la séquence plus lisible : int i = 0b1010_1010_0011;

0 votes

@Russ Que signifie 0b ici ? Comment s'appelle cette fonctionnalité en Java 7 ?

1 votes

0b signifie binaire. La fonctionnalité s'appelle littéraux binaires: docs.oracle.com/javase/7/docs/technotes/guides/language/…

69voto

Cameron McKenzie Points 199

Ainsi, avec la sortie de Java SE 7, la notation binaire devient standard dès la sortie de la boîte. La syntaxe est assez simple et évidente si vous avez une bonne compréhension 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 de classe en binaire, il n'y a absolument aucun problème à initialiser une variable statique en utilisant également la notation binaire :

public static final int thingy = 0b0101;

Mais faites attention de ne pas déborder les nombres 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 vous amuser, vous pouvez combiner cette autre fonctionnalité sympa de Java 7 appelée littéraux numériques avec des traits de soulignement. Jetez un œil à ces exemples élégants 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, sans parler de 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 la notation binaire : Maîtrise de l'examen OCP Java Programmer (OCPJP)

3 votes

Pourquoi votre données de byte = 0b0000110011; a-t-elle 10 bits? Je suis nouveau en programmation mais je pense qu'elle devrait ressembler à 0b00110011 pour correspondre aux 8 bits du type de données byte.

1 votes

Pour ceux qui se posent la même question que Mike, c'est parce que le compilateur le convertit en le nombre qu'il représente - vous pourriez avoir des dizaines de zéros inutiles et cela n'affecterait pas la valeur réelle. Le processus de compilation est essentiellement le même que si vous aviez écrit un décimal à cet endroit.

1 votes

Par définition, le type primitif byte peut stocker 256 nombres entre -128 et 127 (-128 à -1 et 0 à 127). Mais comment représenter -128 à l'aide d'une valeur binaire. par exemple, byte b = -0b1111111; représente -127 mais qu'en est-il de -128 ?

54voto

Ed S. Points 70246

Il n'y a pas de littéraux binaires en Java, mais je suppose que vous pourriez faire cela (bien que je ne voie pas l'intérêt) :

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

1 votes

Parmi d'autres utilisations, le motif de hachures pour le tracé de lignes et de polygones est spécifié sous forme d'un entier dans plusieurs bibliothèques graphiques populaires. En utilisant parseInt ou parseShort, le développeur peut facilement visualiser le motif.

5 votes

Depuis Java 7, la réponse de Russ Hayward est la réponse correcte. Avant Java 7, vous pouvez utiliser un outil en ligne ou votre calculatrice préférée pour convertir le binaire en l'une des notations reconnues par les anciennes versions de Java (octal, décimale ou hexadécimale). Si un autre radix est utilisé, un commentaire descriptif contenant la représentation binaire peut être placé à la déclaration pour clarifier la valeur pour les lecteurs.

0 votes

Il s'agit d'une solution plutôt sale, n'est-ce pas? Vous prenez simplement 16 octets pour représenter 1 octet (sans compter le deuxième argument et la conversion). Bien sûr, à moins que le compilateur n'optimise cela, ce que je doute.

18voto

chgman Points 211

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 ajouté les modificateurs pour clarifier l'utilisation possible en tant que masque de bits. Cependant, il y a 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 en 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 rend évident que le 12ème bit est à 1 (le compte commence à partir de 0, de droite à gauche); et lorsque vous survolez le curseur de la souris, la bulle d'information

long NomDeVotreClasse.mask12 = 4096 [0x1000]

apparaît dans Eclipse. Vous pouvez définir des constantes plus complexes 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.

0 votes

Brillante solution! (public final static long mask12 = 1L << 12;)

12voto

Pierre Points 1854

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

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

Quelques exemples:

int i = 0xcafe ; // cas hexadécimal
int j = 045 ;    // cas octal
int l = 42 ;     // cas décimal

1 votes

Cela ne répond pas à la question.

0 votes

Année 2017: Heureusement, il existe une notation pour la représentation binaire. Il commence par "0b". Exemple: byte b = 0b01000001 (pour une meilleure lisibilité byte b = 0b0100_0001).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X