6

入力デバイスから「6FD40640」というバイトを読み取ったとします。数値は、MilliArcSeconds形式の経度の読み取り値です。トップビット(0x80000000)は基本的に常にゼロであり、この質問では無視されます。

バイトを符号なし整数に簡単に変換できます:1876166208

しかし、その符号なしの値を最終的な31ビットの符号付き整数に変換するにはどうすればよいですか?

これまでのところ、私が思いついたのは次のとおりです。

  1. 値と0x40000000の場合、実際には負であるため、変換する必要があります
  2. 負の場合は、一番上のビットを取り除き、残りのビットで何かをします...

だから私はそれが負の数であるかどうかを知ることができますが、負の数が何の値であるかを知るために、私は残りのビットで何かをしなければなりません-人の補数?Javaでそれを行うにはどうすればよいですか?

別の言い方をすれば、Javaで符号なし整数を31ビットの符号付き整数に変換するにはどうすればよいですか?

ありがとうございました!

4

2 に答える 2

4

答えは、入力の下位 31 ビットが何を表すかによって異なります。

int input = 0x6FD40640 & 0x7FFFFFFF; //strip top bit; only here for clarity

符号なし入力:0x6FD40640 == 1876166208

2 の補数 (望ましい出力: -271317440)

2の補数の整数は、-1 にすべてのビットが設定され、負の数がそこからカウントダウンされるものです。最初のビットは引き続き符号ビットとして機能します。

1000 -> -8
1001 -> -7
...
1110 -> -2
1111 -> -1
0000 ->  0
0001 ->  1

下位 31 ビットが 2 の補数の整数を表す場合、これを実行できるはずです。

input = (input << 1) >> 1;

これは、Java が内部的に整数を 2 の補数で格納するためです。符号ビットが取得され、整数が 31 ビットから 32 ビットになるように、左にシフトしてから右にシフトする (符号付き) だけです。

1 の補数 (目的の出力: -802424384)

1の補数表現は、最初のビットが専用の符号ビットで、残りのビットが大きさを表すものです。-100 の下位ビットは、100 の下位ビットと同じになります。

 1111 -> -7
 1110 -> -6
 ...
 1001 -> -1
 1000 -> -0 (anomoly)
 0000 ->  0
 0001 ->  1

下位 31 ビットが1 の補数の整数 (つまり、符号ビットの後に符号なしの大きさを表す 30 ビットが続く) を表す場合、Java が値を適切に抽出できるように、それを 2 の補数に変換する必要があります。これを行うには、下位 30 ビットを抽出して -1 を掛けるだけです。

if ( input & 0x40000000 ) {
   input = (input & 0x3FFFFFFF) * -1;
}

あなたは質問のコメントで、度に変換した後(3600000で割った後)、約-75.36になると言いました。 -271317440 を 3600000 で割ると、 -75.36595555555556 が得られるので、入力形式は 2 の補数であると推測しているため、最初の元の答えは正しかったです。

于 2010-10-14T16:24:15.793 に答える
0

符号なし整数を符号付きとして読み取るには、最上位ビット (負のフラグ) が設定されているかどうかを識別する必要があります。設定されている場合は、数値のすべてのビットを反転します (したがって、最上位ビットをクリアし、数値を負の表現に切り替えます)。前述のプロセスを実行するときは、結果の数値が負になるという事実にも注意する必要があります。

// Convert the hex bytes to an unsigned integer
long MAS = Integer.ValueOf("6F D4 06 40".replace (" ",""),16);
boolean isLongitudeNegative = false;

// Is the negative-bit set? If so, strip it and toggle all bits.
if (MAS & 0x40000000 > 0) {
    // then it's negative, so strip the negative bit and flip all the other bits
    MAS ^= 0xFFFFFFFF;
    // Throw away the unused bit.
    MAS &= 0x7FFFFFFF;
    isLongitudeNegative = true;
}

// Now convert from MAS to degrees minutes seconds
String DMS = convertMASToDMS(isLongitudeNegative,MAS);
于 2010-10-15T14:15:18.680 に答える