2

次のように、各バイトを個別に区切るために整数をマスクしようとしています。

     int a = (0xffffffff & 0xff000000) >> 24;
     int b = (0xffffffff & 0x00ff0000) >> 16;
     int c = (0xffffffff & 0x0000ff00) >> 8;
     int d = 0xffffffff & 0x000000ff;

この場合、b、c、および d は正しい答え 255 を返しますが、a は、何に変更しても -1 およびその他の負の数を返し続けます。試してみました。

             int a = (0xefffffff & 0xff000000) >> 24;

そしてそれは私に-17を与えます。

この境界ケースで a が 255 およびその他の正の数を与えるように、この問題を解決する方法を誰かが知っていますか?

4

3 に答える 3

9

これは符号拡張によるものです。最上位ビットが 1 の場合、1 を>>シフトインします。これは、引数の符号を保持するためです。常に 0 にシフトする whichを使用します>>>。または、シフト後にマスクします。

int a = (0xffffffff >> 24) & 0x000000ff;
于 2012-09-13T18:18:50.010 に答える
2

符号付きシフトを行っているため、符号は保持されます。

int a = (0xffffffff & 0xff000000) >>> 24; // unsigned shift.

また

int a = 0xffffffff >>> 24; // unsigned shift and all the bottom bits are lost anyway
int b = (0xffffffff >>> 16) & 0xFF;
int c = (0xffffffff >>> 8) & 0xFF;
int d = 0xffffffff & 0xFF;
于 2012-09-13T18:20:09.010 に答える
0

unsigned shifting、が必要だと思います

この方法で試してみてください...

(0xffffffff & 0xff000000) >>> 24

于 2012-09-13T18:23:16.197 に答える