1

ビットをバイトで出力する関数を作成しました。これは、最上位ビットを入力バイトと比較して 1 に設定し、それが 1 の場合は "1" を出力し、それ以外の場合は "0" を出力することによって発生します。次に、比較バイトが右にシフトされます。

10000000 から 01000000 にシフトしてから 00100000 にシフトするにはどうすればよいですか...

私の問題は int に昇格してから再キャストしたことが原因だと思いますが、解決策がわかりません。

package errorreporting;

public class ErrorReporting {

ErrorReporting() {
}

public static void main(String[] args) {

    ErrorReporting myError = new ErrorReporting();
    byte myByte = 16;
    myError.printByteArray(myByte);

}

public void printByteArray(byte inputByte) {
    // print out 1 or 0
    byte comparison = -128;
    for (int x = 0; x < 8; x++) {
        if ((inputByte & comparison) != 0) {
            System.out.print("1");
        } else {
            System.out.print("0");
        }
        //       System.out.print(" comparison : " + comparison);
        comparison = (byte) (comparison >>> 1);

    }
    System.out.println(" : " + inputByte);
}

}

この投稿にはいくつかの情報があります:Javaビットシフトの奇妙さ

4

1 に答える 1

1

私の問題は int に昇格してから再キャストしたことが原因だと思います

はい、それはいくつかの暗黙的および明示的なキャストと符号拡張の組み合わせです。

  1. すべての引数は、シフト操作が行われる前に最初に int に昇格されます。https://stackoverflow.com/a/3948303/1611055も参照してください。

  2. 1. のため、符号なしシフト演算子>>>は役に立ちません0。a を左端の位置に正しくシフトしますが、シフトが適用される前に-128ソース引数が int に昇格されているため(結果として)、最初のシフトの後に終了します。 .0xffffff800x7fffffc0

最も簡単な解決策はint、マスクに を使用することです。

int comparison = 0x80;  // -128;

理論的には、マスクにバイトを使用することもできますが、次のintように、シフト演算子を適用する前に、同時に符号ビットを破棄しながら明示的に変換する必要があります。

byte comparison = -128;
...
comparison = (byte)( (((int) comparison) & 0xff) >>> 1);

((int) comparison) & 0xff)バイトが実際には「符号なし」であると想定し、対応する「符号なし」の int 値に変換します。次に、シフト演算子を適用して ( >>or>>>は関係ありません。intどのような場合でも正の値があるため)、それを a にキャストし直すことができbyteます。

于 2013-03-14T10:20:42.823 に答える