2017-10-11 3 views
0

ich so etwas wie diese:konvertieren 32-Bit-Daten zu unsigned long Wert

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

ich sie kombinieren möchte und einen langen Wert in Java machen. Dies ist mein Versuch:

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

Der Ausgang sein sollte: 10.111.627, aber ich bekomme 168497179. Wahrscheinlich etwas in Konvertierung Ich vermisse aber haben keine Ahnung, was ...

EDIT

Dies ist ein Beispiel, wie der Wert im 32-Bit-Register abgelegt wird.

+1

10111627 besteht nicht aus 4123 und 2571, egal wie ich es betrachte. In Hex sind die kleinen Teile 0x101b und 0x0a0b, ich kann das nicht in 0x009a4a8b in irgendeiner vernünftigen Weise drehen. Woher weißt du, was die Ausgabe sein soll? Ist dieser Teil überhaupt richtig? – harold

+1

Ihr Code ist korrekt. Dein Test ist falsch. – erickson

+0

Bitte sehen Sie meinen aktualisierten Beitrag. Es gibt ein Bild, das zeigt, wie der Wert in einem 32-Bit-Register gespeichert wird und wie ich das Ergebnis erhalten soll: 10111627 – Josef

Antwort

0

ich die summarise versuchen und hoffentlich klären, was die verschiedenen Kommentare auf Ihre Frage bereits an:

Wenn Sie die Nummer aus dem Bild erhalten möchten, das ist
00001010 00001011 00010000 00011011 = 0x0A0B101B = 168497179
in einem einzigen long Wert und Sie haben zwei Ints
0001000000011011 = = 4123 und
0000101000001011 = 0x0A0B = 2571
als Ihr Code ist korrekt.

Ich würde Sie empfehlen, in hexadezimalen Zahlen gewöhnen, da sie leicht zeigen, dass es keine binäre Beziehung zwischen 0x0A0B & 0x101B und 0x009A4A8B = 10111627.

BTW Ihr Bild ist widersprüchlich: die Binärzahlen darstellen, wie oben die Zahl 0x0A0B101B gesehen, aber die hexadezimal lesen 0x0A0B101E(man beachte die E) während die Nachkommastellen den binären Wert zu unterstützen.

Schließlich dachte ich, Ihre Fehler heraus:

Sie scheinen zu erwarten, dass die Dezimalzahl zusammen als Ergebnis verketteten zu erhalten. Aber im Gegensatz zu den Hexadezimalen hier tut es nicht auf diese Weise in Dezimal arbeiten!

Lassen Sie mich das ausarbeiten. Sie haben die Binärzahl:
00001010 00001011 00010000 00011011
, die Sie leicht zu Hex-Block für Block
0x0A 0x0B 0x10 0x1B
umwandeln und als sie nur zusammen
0x0A0B101B

beitreten Aber das Magie verbinden ist nur eine Vereinfachung nur auf die Anwendung hex (und der Grund, warum Hex bei Programmierern so beliebt ist).

Bei der langen Version müssen Sie die höheren Blöcke/Bytes (nach links) mit der 'Basis' des vorhergehenden Blocks (rechts) multiplizieren. Der rechte Block wird immer mit 1 multipliziert. Die Basis für den nächsten Block ist (da 8 Bits im ersten Block sind) 2 = 256 = 0x100. Die Basis für den dritten Block ist (8+8 Bits) 2 = 65536 = 0x10000. Die letzte (am weitesten links) muss mit (8+8+8 Bits) multipliziert werden. 2 = 16777216 = 0x1000000.

wir ein Beispiel für die ersten beiden Blöcke machen:

Hexadezimal:
0x10 || 0x1B
(0x10 * 0x100) + (0x1B* 0x1)
0x1000 + 0x1B = 0x101B

Dezimal:
16 || 27
(16 * 256) + (27 * 1)
4096 + 27 = 4123

Wie können Sie auf Ihrem Bild sehen sie beide in sie (die E/B Problem bemerken, die eine in dezimal 6/3 Ausgabe ist) aber es gibt keine 1627 . Das Konvertieren von binären oder hexadezimalen Zahlen in Dezimalzahlen ist eine nichttriviale Aufgabe (für Menschen), am besten, einen Taschenrechner zu verwenden.

Verwandte Themen