2017-10-11 6 views
0

J'ai quelque chose comme ceci:Convertir les données 32bit à la valeur unsigned long

int[0] = 4123; 
int[1] = 2571; 

Je voudrais les combiner et faire une longue valeur en Java. Ceci est ma tentative:

int[] r = { 4123, 2571 }; 
long result = ((r[1] & 0xFFFF) << 16 | (rs[0] & 0xFFFF)); 
System.out.prinln(result); 

La sortie devrait être: 10111627 mais je reçois 168497179. probablement me manque quelque chose dans la conversion, mais n'ont pas idée de ce que ...

EDIT

Ceci est un exemple de la façon dont la valeur est placée dans le registre 32 bits.

+1

10111627 n'est pas composé de 4123 et 2571, peu importe comment je le regarde. En hexadécimal les petites parties sont 0x101b et 0x0a0b, je ne peux pas transformer cela en 0x009a4a8b d'une manière raisonnable. Comment savez-vous ce que la sortie devrait être? Cette partie est-elle même correcte pour commencer? – harold

+1

Votre code est correct. Votre test est faux. – erickson

+0

S'il vous plaît voir mon post mis à jour. Il y a une image qui montre comment la valeur est stockée dans le registre 32 bits et comment je reçois que le résultat soit 10111627 – Josef

Répondre

0

J'essaie le Résumer et clarifient, espérons que les quelques commentaires sur votre question indiquent déjà:

Si vous voulez obtenir le numéro de votre image qui est
00001010 00001011 00010000 00011011 = 0x0A0B101B = 168497179
en une seule valeur long et vous avez deux entrées
0001000000011011 = 0x101B = 4123 et
0000101000001011 = 0x0A0B = 2571
que votre code est correct.

Je vous recommande de vous habituer à des nombres hexadécimaux comme ils montrent facilement qu'il n'y a pas de relation binaire entre 0x0A0B & 0x101B et 0x009A4A8B = 10111627.

BTW votre image est contradictoire: les nombres binaires représentent comme on le voit au-dessus du nombre 0x0A0B101B mais les hexadécimaux lu 0x0A0B101E(notez le E) tandis que les décimales prennent en charge la valeur binaire.

Enfin, je me suis dit votre défaut:

Vous semblez attendre à obtenir le nombre décimal concaténés comme résultat. Mais contrairement aux hexadécimaux ici, il ne fonctionne pas comme de cette façon en décimal!

Laissez-moi développer cela. Vous avez le nombre binaire:
00001010 00001011 00010000 00011011
que vous pouvez facilement convertir en bloc hexagonal par bloc
0x0A 0x0B 0x10 0x1B
et que de les réunir
0x0A0B101B

Mais cette magie joindre est juste une simplification ne fait qu'appliquer à hex (et la raison pour laquelle hex est si populaire parmi les programmeurs).

La version longue est de multiplier les blocs/octets supérieurs (vers la gauche) par la 'base' du bloc précédent (à droite). Le bloc le plus à droite est toujours multiplié par 1. La base pour le bloc suivant est (puisqu'il y a 8 bits dans le premier bloc) 2 = 256 = 0x100. La base du troisième bloc est 8+8 bits. Le dernier (le plus à gauche) doit être multiplié par (8+8+8 bits) 2 = 16777216 = 0x1000000.

permet de faire un exemple pour les deux premiers blocs:

Hexadécimal:
0x10 || 0x1B
(0x10 * 0x100) + (0x1B* 0x1)
0x1000 + 0x1B = 0x101B

décimal:
16 || 27
(16 * 256) + (27 * 1)
4096 + 27 = 4123

Comme vous pouvez le voir sur l'image les deux dans ce (notez le numéro E/B qui est dans une décimale question 6/3) mais il n'y a pas 1627 . Donc convertir des nombres binaires ou hexadécimaux en décimales est une tâche non triviale (pour les humains), préférable d'utiliser une calculatrice.