Wie zum ausführen von unsigned zu signed Konvertierung in Java?
Sagen, ich lese diese bytes: "6F D4 06 40" von einem Eingabegerät. Die Zahl ist ein Längen-zu Lesen in MilliArcSeconds-format. Das oberste bit (0x80000000) ist im Grunde immer null und wird ignoriert, für diese Frage.
Kann ich leicht umwandeln der bytes an, die ein unsigned integer: 1876166208
Aber wie kann ich konvertieren, dass unsigned-Wert in seine endgültige form des 31-bit-signed-integer?
Bisher alle, die ich mir ausgedacht habe ist:
- wenn der Wert & 0x40000000, dann ist es eigentlich negativ, konvertieren es
- Wenn es negativ ist, Streifen die Oberseite wenig und etwas zu tun mit der restlichen bits...
Also ich kann sagen, wenn es eine negative Zahl ist, aber um zu wissen, welchen Wert das negative Zahl ist, ich habe etwas zu tun mit den verbleibenden bits - ein Kompliment? Wie mache ich das in Java?
Anderen Weg, um die Frage, wie kann ich konvertieren einer Ganzzahl in einen 31-bit-Ganzzahl in Java?
Danke!
Input: "6F D3 FD 45". Output: Etwa -75.366465. Ich sage annähernd, weil ich fand eine Stelle und blieb dort, um Daten zu sammeln und zur gleichen Zeit gemessen, die Position mit einem GPS. Also die Länge oben (-75.366465) sollte in der Nähe sein, aber wahrscheinlich nicht genau den gleichen Wert hat wie die oben genannten hex-bytes konvertiert eine Ganzzahl (und MAS in Grad Umwandlung durchgeführt). ich versuche einen Weg zu finden, zu gehen von die hex-bytes in ein signed int mit Java
MAS Grad: teilen von 3,600,000.
Immer in der Nähe von... Eigentlichen Lesung mit den "negativen etwas" entfernt: "2F D3 FD 45"... vergleichen Sie dies mit dem erwarteten MAS-Wert von -75.366465 "10 2C 00 EA"... die Ersten 22 bits entsprechen, wenn ich flip 1 zu 0 und 0 zu 1 (XOR). Ich denke, das könnte der trick - muss die Reihenfolge aller bits... ich kann das mit einem XOR...
sind Sie richtig. Ich entschuldige mich.
InformationsquelleAutor Brad Hein | 2010-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort hängt davon ab, was die unteren 31 bit Ihrer Eingabe repräsentieren sollen.
Unsigned input:
0x6FD40640 == 1876166208
Zweierkomplement (gewünschte Ausgabe: -271317440)
Einen Zweierkomplement integer, eine ist bei -1 alle bits gesetzt, und niedrigere negative Zahl nach unten von dort. Das erste bit immer noch wirkt wie ein Vorzeichen-bit.
Wenn die unteren 31 bit repräsentieren zwei der Ergänzung Ganzzahl, dann denke ich, Sie sollte nur in der Lage sein, dies zu tun:
Weil Java speichert ganze zahlen im Zweierkomplement intern: alles, was wir tun, ist eine Verschiebung nach Links und dann shift wieder rechts (unterzeichnet), so dass das Vorzeichen-bit ist abgeholt und die ganze Zahl geht aus 31 bits zu 32 bits.
Einerkomplement (gewünschte Ausgabe: -802424384)
Einen Einerkomplement Zahl-Darstellung ist eine, wo das erste bit ist ein spezieller bit-Zeichen, und die restlichen bits repräsentieren die Größenordnung. Die unteren bits von -100 wird die gleiche sein, wie die unteren bits von 100:
Wenn die unteren 31 bit repräsentieren eine Einerkomplement integer (ein Vorzeichen-bit, gefolgt von 30 bits repräsentieren eine vorzeichenlose Größe), dann müssen Sie es zu konvertieren in Zweierkomplement, so dass Java-extrahiert den Wert richtig. Um dies zu tun müssen Sie nur extrahieren Sie die unteren 30 bits und multiplizieren Sie mit -1:
Ihnen sagte, in der Frage der Kommentare, die nach der Umstellung auf Grad (Division durch 3600000) erhalten Sie rund um -75.36. , Wenn ich Teile -271317440 durch 3600000 bekomme ich -75.36595555555556, so dass ich vermute, Ihre input-format Zweierkomplement, also meine erste und ursprüngliche Antwort richtig war.
& 0x7FFFFFFF
ist aber notwendig.Es scheint, wie die &7fffffff und die Links - /rechts-shift das gleiche tun (drop von der linken oberen bit)? Ich arbeite immer einige Beispiel-Daten, damit wir dies testen können
Nein, es war nur da, um zu zeigen, dass der input-lag nur die unteren 31 bit, und dass das höchste bit ist irrelevant. Die zweite Zeile ist das, was ich versucht habe zu zeigen, aber Brad hat sich nicht bestätigt, ob das das gewünschte Ergebnis ist oder nicht.
einfach Verknüpfung von
&7FFFFFFF
wird einfach klar das oberste bit. Diese verschiebt sich nach Links, sondern verschiebt sich auf das Recht, in einem sign-extended Art und Weise. In anderen Worten, es füllt das erste bit mit dem zweiten bit. Aber nochmal würde ich brauchen, um zu sehen, was das gewünschte Ergebnis ist...ich weiß nicht, was die 31 die unteren bits darstellen sollen.Warum ist diese Antwort immer up-gevotet? Es geht nicht um die Frage überhaupt. Bitte Lesen Sie nochmals die Frage!
InformationsquelleAutor Mark Peters
Lesen unsigned integer als signed ist eine Frage der Ermittlung, ob das höchstwertige bit (negativ-flag) gesetzt ist, und wenn dem so ist, spiegeln alle bits der Zahl (also löschen des höchstwertigen bit, und schalten die Anzahl der negativen Darstellung. Bei der Durchführung der vorgenannten Verfahren müssen Sie auch notieren Sie sich die Tatsache, dass die sich daraus ergebende Zahl ist negativ.
MAS = ~MAS
zu werden, einen klaren Weg durch das Umschalten der bits des MAS. So gegeben, diese Lösung, ich nehme an, die unteren 31 bit des input-stellen eine 31-bit-einer-Komplement Ganzzahl, und Sie versuchen, zu extrahieren, Wert? Ist, dass das problem, das Sie lösen wollten?Überprüfen Sie meine Antwort wieder. Ich bin mir ziemlich sicher, dass meine ursprüngliche Antwort richtig war. Wenn ich meine transformation Ihrer Probe-Eingang und dann geteilt durch die 3600000 bekomme ich -75.369555 was ist Ihre erwartete Leistung. Wenn ich Ihre transformation bekomme ich -222, die nicht jive.
InformationsquelleAutor Brad Hein