2

たとえば、1バイトで2つの16進数記号を切り替えたい

input  = 0xEA 

それから

output = 0xAE

それはJavaでなければなりません。

私はすでにこのメソッドを作成しましたが、一部のケースでのみ機能します。

public static final byte convert(byte in){

    byte hex1 = (byte) (in <<  4);
    byte hex2 = (byte) (in >>> 4);

    return (byte) (hex1 | hex2);
}

実際の例は次のとおりです。

input:  0x3A 
hex1:   0xA0
hex2:   0x03
output: 0xA3

動作しない例は次のとおりです。

input:  0xEA
hex1:   0xA0
hex2:   0xFE
output: 0xFE

なぜこれが機能しないのか、誰でも光を当てることができますか?

4

2 に答える 2

4

問題は符号の拡張だと思います。具体的には、おそらく行う必要があります

byte hex2 = (byte) ((in >>> 4) & 0xF);
于 2012-12-16T02:27:54.313 に答える
1

試す

    byte hex1 = (byte) (in <<  4);
    byte hex2 = (byte) ( in >>> 4);
    return (byte) (hex1 | hex2 & 0x0F);

これは既知のパズルのようなものです

    byte x = (byte)0xFF;
    x = (byte) (x >>> 1);
    System.out.println(x);

-1符号なしシフトの前に0xFFがint->0xFFFFFFFFにプロモートされるために出力されます。シフト後は0x7FFFFFFFです。バイトにキャスト->0xFF

しかし

    byte x = (byte)0xFF;
    x = (byte) ((x & 0xFF) >>> 1);
    System.out.println(x);

0xFFFFFFFF-> 0x000000FFを切り捨てたために出力127され、shiftは0x0000007Fを生成し、バイト->0x7Fにキャストします

実際、このプロモーションはコンパイル時に行われます。JVMは、4バイトまたは8バイトのオペランド(スタック上のローカル変数)でのみ機能します。バイトコードのブール値でさえ0または1intです。

于 2012-12-16T02:32:30.247 に答える