5

私はこのような低レベルの操作に不慣れです。誰かが私がここで犯さなければならない明らかな間違いを指摘してくれることを望んでいます。

//Input value - 00111100
//I want to get the value of the bits at indexes 1-3 i.e 0111.

byte mask = (byte)0x00001111; // This gives 17 not the 15 I'd expect 

byte shifted = (byte)(headerByte >> 3);
//shifted is 7 as expected

byte frameSizeValue = (byte)(shifted & mask); //Gives 1 not 7

問題はマスクの定義方法にあるようですが、修正方法がわかりません。

4

4 に答える 4

7

まず第一に、 -0x00001111よりも大きい数である16進数であり、オーバーフローします。2進数を表す方法、または単にを使用する方法については、こちらをご覧ください。25516^3 + 16^2 + 16 + 1 = 4369byteshifted & 15

于 2011-11-14T15:53:30.897 に答える
5

マスクはバイナリ00001111 である必要があり、これは 16 進数の 0x0F に相当します。

byte mask = (byte)0x0F;
于 2011-11-14T15:55:52.223 に答える
4

Java 7 では、バイナリ リテラルを作成できます

byte binaryLit = (byte)0b00001111;

0xsomenumbers は 16 進リテラルであり、Java7 より前ではバイナリはサポートされていません。

于 2011-11-14T16:04:22.690 に答える
0

最初の3ビットをマスクしたいと言いますが、Petarが言うように、0x001111はビットではありません。3ビットをマスクする場合は、7でマスクする必要があります

于 2011-11-14T15:53:48.043 に答える