8
votes

Représentation binaire en Java

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.

Voici Un échantillon de code: xxx

couple de question:

  1. Comment obtenir Num1 (par exemple) de l'AT qui est déjà dans ce binaire
  2. Pourquoi obtenir 16909060 lorsque j'imprime nirbinaire - Qu'est-ce que cela signifie? Comment obtenir NUM1 (par exemple) de l'AT qui est déjà dans ce binaire Représentation?

    merci


1 commentaires

Pourrait-il être que le nombre que vous obtenez est 2 ^ 24 + 2 * 2 ^ 16 + 3 * 2 ^ 8 + 4?


7 Réponses :


0
votes
  1. C'est fondamentalement 1 * 2 ^ 24 + 2 * 2 ^ 16 + 3 * 2 ^ 8 + 4 = 16909060
  2. Vous pouvez obtenir num1 en faisant num1 = nirbinary >> 24 .

0 commentaires

0
votes
  1. Qu'avez-vous espéré à la place?
  2. Pour obtenir l'octet le plus important d'un int I:

    (i >> 24) & 0xFF


0 commentaires

26
votes

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);


2 commentaires

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



13
votes

16909060 signifie le numéro 16909060.

C'est (1 * 2 24 ) + (2 * 2 16 ) + (3 * 2 < sup> 8 ) + 4 .

pour obtenir num1 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 (*) , mais pour les autres): xxx note que nirbinary n'est pas "une représentation binaire". Ou plus précisément: ce n'est plus ni moins binaire que num1 , num2 , num3 et num4 : interne tous les numéros (et des caractères, et des booléens, ...) sont stockés en binaire.

(*) Notez que si num1 est> 127, alors vous Besoin d'utiliser >>> pour faire le bon changement ou Utilisez le & 0xFF afin de vous assurer que la valeur correcte est restaurée. La différence entre >>> et >>> sont les "nouveaux" bits insérés sur le côté "gauche" de la valeur: avec >> Ils dépendront du bit de valeur la plus haute (appelé extension de signe) et avec >>> ils seront toujours 0.


2 commentaires

Merci pour le commentaire. Pouvez-vous m'expliquer quelle est la signification de l'écriture & 0xff ? 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 Il n'y a pas de différence (car num1 est "stocké" dans les 8 bits les plus élevés de nirbnary ). Mais pour num2 , num3 et num4 est là pour supprimer les bits supérieurs qui stockent les autres numéros (c.-à-d. Si vous l'avez fait Nirbiny> > 16 Vous obtiendriez une certaine valeur contenant num2 dans les 8 bits les plus bas et num1 dans les 8 bits suivants). Le & 0XFF définit tous les bits, à l'exception des 8 les plus bas à zéro, en supprimant efficacement les autres valeurs.



3
votes

Chaque int 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; est une manipulation binaire de 4 int s dans un autre int. Cela ne change pas la représentation de nirbinary en binaire, car Nirbinary n'a pas de représentation, car (encore), il n'est qu'un chiffre.

integer.tobilarystring (Nirbinary) renvoie la représentation binaire de nirbinary qui signifie "Comment ressemblerait des nibinaires à la base-2".

Si vous avez une chaîne qui est une représentation binaire d'un nombre, vous pouvez obtenir sa valeur, en utilisant INTEGER.PARSINTINT (YOURRYREREPRESENTATION, YURBASE); Par exemple - INTEGER.PARSINT (NIR, 2);

et une autre chose:

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: xxx

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 ou sur deux autres numéros: xxx

dans votre cas, si Chaque numéro est inférieur à 256, vous Peut l'inverser avec l'opération suivante: xxx

par exemple, pour récupérer num1 Vous pouvez faire: xxx


0 commentaires

2
votes

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.

  • SO 0x01 << 8 => 0x0100
  • 0x01 << 16 => 0x010000
  • etc.

    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: xxx

    0x01 << 8 produira 0x0100 . Maintenant, vous devez simplement remplacer le dernier 00 avec 02, puisque vous ou vous: 0x0102

    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. > 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


0 commentaires

3
votes

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


0 commentaires