5

私は現在、いくつかの24ビット整数を扱う作業を行っています。

基本的に、これらの 24 ビットから符号付きと符号なしの両方の値を取得できる必要があります。

現在、次のコードを使用して 3 バイトをまとめて、その値を返しています。

private static int bytesToInt(byte[] input) {
    if (input.length == 3) {
        return (input[2] & 0xFF) << 16 | (input[1] & 0xFF) <<8 | (input[0] & 0xFF);
    }
}

私が与えている入力はバイトです。0x42 0x87 0xfe返される結果は次のとおりです。16680770

これは(私が信じている)正しい符号なしの値ですが、符号付きの値も必要です。-96446

それを解決するには、ここでビットシフトを行う必要があると思いますが、これを達成する方法がわかりません。

結果を an と long にキャストしようとしましたが、どちらも符号付きの値を返しません。Math.abs(result) も試しましたが、それを正しく使用しているとは思いません。

任意の入力をいただければ幸いです。

ありがとう

4

2 に答える 2

6
private static int bytesToUInt(byte[] input) {
    if (input.length == 3) {
        return (input[2] & 0xFF) << 16 | (input[1] & 0xFF) <<8 | (input[0] & 0xFF);
    }
}
private static int bytesToSInt(byte[] input) {
    if (input.length == 3) {
        return (input[2]) << 16 | (input[1] & 0xFF) <<8 | (input[0] & 0xFF);
    }
}
于 2013-02-13T15:27:41.647 に答える
2

1 つのオプションは、上位 8 ビットを 1 で埋めることです。

int x = 16680770;
int y = x | 0xff000000;
System.out.println(y); // -96446

または、単に減算することもできます1 << 24:

int y = x - (1 << 24);
于 2013-02-13T15:27:03.873 に答える