1

2バイトを短いものにまとめるには:

/* combine 0xa5 and 0x9c to 0xa59c */                                                                                                                 
public class Unsigned
{
    public static void main(String[] args)
    {
        byte a = (byte) 0xa5;
        byte b = (byte) 0x9c;
        //int c = ((a&0xff)*256)&0xffff+(b&0xff); // 0
        //int c = a*256+b; // ffffa49c
        int c = (int)a*256+(int)b; // ffffa49c
        System.out.printf("%4x\n", c);
    }
}

なぜそれらはすべて間違っているのですか?

====

実行可能なバージョン:

/* combine 0xa5 and 0x9c to 0xa59c */                                                                                                                 
public class Unsigned
{
    public static void main(String[] args)
    {
        byte a = (byte) 0xa5;
        byte b = (byte) 0x9c;
        //int c = ((a&0xff)*256)&0xffff+(b&0xff); // 0
        //int c = a*256+b; // ffffa49c
        //int c = (a&0xff)*256+(b&0xff); // a59c
        int c = ((a & 0xFF )<< 8) | (b & 0xFF);  // a59c
        System.out.printf("%4x\n", c);
    }
}
4

3 に答える 3

3

乗算の代わりにビット単位の演算を使用することをお勧めします。また、符号拡張によってバイトがintに変換されないようにするために(両方とも符号付き)、最初の最下位8ビットにビットマスクを適用できます。コード内:

int a_byte = ((int)a & 0xFF);
int b_byte = ((int)b & 0xFF);
int c = (a_byte << 8) | b_byte;

ビット単位のORの代わりに合計も、結果なしでここで機能します。この場合、intへの明示的な変換も省略できます。

実際の質問に答えるには、挿入した値は実際には負でした(0x7F以上)。両方をintに変換した結果、負の符号が維持され、追加の24ビットがすべて1に設定されました。これは確かに結果に影響しました。

于 2012-08-12T15:13:13.890 に答える
1

あなたがする必要があるのはこれです:

int c = ((a & 0xFF )<< 8) | (b & 0xFF);
于 2012-08-12T15:11:24.940 に答える
1

System.out.printf("%x\n",(short)((a << 8) | (0xff & b)));

short2バイトを取得するためにキャストします。ffffa59c

左にシフトしてa5とORwithを保持します0xff&b(これは、保持する0xff9cときにそうなります)ORa5

于 2012-08-12T15:24:22.257 に答える