Tout comme vous pouvez définir une constante entière en hexadécimal ou en octal, puis-je le faire en binaire ?
Je tiens également à souligner qu'il peut y avoir des caractères _
pour rendre la séquence plus lisible : int i = 0b1010_1010_0011;
Tout comme vous pouvez définir une constante entière en hexadécimal ou en octal, puis-je le faire en binaire ?
Je tiens également à souligner qu'il peut y avoir des caractères _
pour rendre la séquence plus lisible : int i = 0b1010_1010_0011;
0b signifie binaire. La fonctionnalité s'appelle littéraux binaires: docs.oracle.com/javase/7/docs/technotes/guides/language/…
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)
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.
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.
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.
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.
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.
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.
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.
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
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.
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é.
1 votes
docs.oracle.com/javase/8/docs/technotes/guides/language/…
0 votes
Année 2017 : la réponse acceptée doit être celle fournie par Russ. Voir : stackoverflow.com/a/1692932/716079