1

数値を連結しようとして、いくつかの2進数を扱っています。この場合、私が望むものを得るでしょう:

  num = 0;
  num = (num<<3)|4;
  num = (num<<9)|7;

これにより、num が 100000000111 に設定されるか、4 桁の 16 進数にフォーマットすると 0x0807 に設定されます。

ただし、負の数を連結しようとすると、次のようになります。

  num = 0;
  num = (num<<3)|4;
  num = (num<<9)|-7;

0x09F9 を取得したいときに 0xFFF9 を取得します。右側の 9 ビットは正しいように見えますが、左側の一部のビットが反転しているようです。論理的または負の値を実行すると、符号ビットが左端のビットまたは何かに移動していると推測しています。これを防ぐ方法はありますか?

また、私の例では、シフトせずに num を数値に設定するだけでよいことを認識していますが、実際のプログラムでは、これらは変数であり、デモのために数値をハードコーディングしただけです。

4

1 に答える 1

3

-7はおそらく 32 ビットの負の数、つまり0xfffffff9. 9 ビットのみを使用する場合は、マスクする必要があります。

num = (num << 9) | (-7 & 0x1ff)
于 2013-02-01T19:58:34.970 に答える