Je trouve difficile de comprendre et de travailler avec cette représentation binaire en Java:
Avec l'aide de l'utilisateur Jon Skeet, j'ai compris que la représentation binaire devrait être construite de cette manière. P>
Voici Un échantillon de code: p> couple de question: p> merci p> p>
16909060 code> lorsque j'imprime
nirbinaire code> - Qu'est-ce que cela signifie?
Comment obtenir NUM1 (par exemple) de l'AT qui est déjà dans ce binaire
Représentation? LI>
ol>
7 Réponses :
1 * 2 ^ 24 + 2 * 2 ^ 16 + 3 * 2 ^ 8 + 4 = 16909060 CODE> LI>
- Vous pouvez obtenir num1 en faisant
num1 = nirbinary >> 24 code>. li>
ol>
(i >> 24) & 0xFF p>
Je ne suis pas complètement sûr de ce que vous manquez, alors je vais simplement expliquer comment vous pouvez convertir des entiers en cordes binaires en java.
Vous pouvez obtenir une chaîne binaire d'un entier comme: P >
int iNew = Integer.parseInt(binString, 2);
Merci pour le commentaire.Je ne veux pas travailler avec des chaînes. Je veux travailler uniquement avec ce genre de représentation binaire, et qu'est-ce que c'est plus intéressant à moi, c'est la façon dont de ce nirbinary, je peux récupérer num 1 par exemple.
Ah ok. Ensuite, les autres réponses seront probablement d'une aide plus utile: D
C'est pour obtenir (*) Notez que si 16909060 code> signifie le numéro 16909060.
num1 code> sortez juste le résultat de la même quantité que vous avez quitté et masque sur les autres octets (pas toujours nécessaire pour
num1 code> (*) sup>, mais pour les autres): p>
nirbinary code> n'est pas "une représentation binaire". Ou plus précisément: ce n'est plus ni moins binaire que
num1 code>,
num2 code>,
num3 code> et
num4 code>: interne tous les numéros (et des caractères, et des booléens, ...) sont stockés en binaire. p>
num1 code> est> 127, alors vous em > Besoin d'utiliser
>>> code> pour faire le bon changement ou em> Utilisez le
& 0xFF code> afin de vous assurer que la valeur correcte est restaurée. La différence entre
>>> code> et
>>> code> sont les "nouveaux" bits insérés sur le côté "gauche" de la valeur: avec
>> code> Ils dépendront du bit de valeur la plus haute (appelé extension de signe) et avec
>>> code> ils seront toujours 0. p> p>
Merci pour le commentaire. Pouvez-vous m'expliquer quelle est la signification de l'écriture & 0xff code>? Et quelle est la différence entre cela et juste pour écrire` num1 = nirbinary >> 24`, comme on l'a suggéré ici?
@Nir: pour num1 code> Il n'y a pas de différence (car
num1 code> est "stocké" dans les 8 bits les plus élevés de
nirbnary code>). Mais pour
num2 code>,
num3 code> et
num4 code> est là pour supprimer les bits supérieurs qui stockent les autres numéros (c.-à-d. Si vous l'avez fait
Nirbiny> > 16 code> Vous obtiendriez une certaine valeur contenant
num2 code> dans les 8 bits les plus bas et b>
num1 code> dans les 8 bits suivants). Le
& 0XFF code> définit tous les bits, à l'exception des 8 les plus bas à zéro, en supprimant efficacement les autres valeurs.
Chaque P> Si vous avez une chaîne qui est une représentation binaire d'un nombre, vous pouvez obtenir sa valeur, en utilisant Vous ne pouvez pas toujours récupérer l'un des chiffres de Nirbinary, car vous avez effectué une manipulation de bits qui n'est pas réversible, par exemple: p> Vous ne pouvez pas reconnaître chacune de vos variables (I1, I2) car elles ont un bit commun, I3 aurait pu être le résultat de dans votre cas, si strong> Chaque numéro est inférieur à 256, vous Peut l'inverser avec l'opération suivante: p> par exemple, pour récupérer int code> est un nombre, ce n'est pas binaire, hexagone ou décimal, c'est juste un nombre. la déclaration
(num1 << 24) | (Num2 << 16) | (Num3 << 8) | num4; code> est une manipulation binaire de 4
int code> s dans un autre int. Cela ne change pas la représentation de
nirbinary code> en binaire, car Nirbinary n'a pas de représentation, car (encore), il n'est qu'un chiffre.
integer.tobilarystring (Nirbinary) code> renvoie la représentation binaire de
nirbinary code> qui signifie "Comment ressemblerait des nibinaires à la base-2". P>
INTEGER.PARSINTINT (YOURRYREREPRESENTATION, YURBASE); CODE> Par exemple -
INTEGER.PARSINT (NIR, 2); code> p>
ou code> sur deux autres numéros: p>
num1 code> Vous pouvez faire: p>
Lorsque vous travaillez avec BitShifting et des entiers, je vous recommanderais de penser aux nombres hexadécimaux, cela rendra généralement la vie beaucoup plus facile. Gardez simplement à l'esprit que 8 bits représentent 1 octet et 1 octet recouvrent la gamme hexagonale de 0x00 à 0XFF
car Num1 à NUM4 sont inférieures à 10, leur représentation décimale est égale à leur représentation hexagonale, à savoir 1 = 0x01, 2 = 0x02 etc .. Comme je vous l'ai dit: 1 octet est de 8 bits. Dans votre opération BitShifting, vous déplacez toujours un multiple de 8. P>
Pour que vous n'ajoutez que zéro octets, ce qui augmente bien sûr la valeur.
Ce que vous faites ensuite est de | eux, un peu ou. Cela signifie que deux bitfields sont modifiés de manière à ce que le résultat ait un 1 au même endroit si au moins une des valeurs d'entrée en tant que 1 là-bas. Étant donné que vos INT de décalage ne contiennent que zéro à l'arrière, un peu ou ne sont rien d'autre que de mettre la valeur à cet endroit.
E.g: p> Si vous souhaitez recréer l'INT d'origine, vous devez masquer la partie que INT représente (Ceci est facile car les pièces ne se chevauchent pas dans votre exemple), puis le remettez-le. P> > 8 qui mettra la 02 dans la dernière partie. Maintenant, masque simplement cette dernière partie 0x0102 && 0XFF. Cela mettra tous les 8 derniers bits à zéro p> p> 0x01 << 8 code> produira
0x0100 code>. Maintenant, vous devez simplement remplacer le dernier 00 avec 02, puisque vous ou vous:
0x0102 code> p>
ici pas besoin de dépendre uniquement de binaire ou de tout autre format ... Une fonction intégrée flexible est disponible Cela imprime quel que soit le format que vous souhaitez dans votre programme ..
Integer.toString(int,representation); Integer.toString(100,8) // prints 144 --octal representation Integer.toString(100,2) // prints 1100100 --binary representation Integer.toString(100,16) //prints 64 --Hex representation Integer.toString(100,5) // prints 400 --Base 5
Pourrait-il être que le nombre que vous obtenez est 2 ^ 24 + 2 * 2 ^ 16 + 3 * 2 ^ 8 + 4?