2

IEEE標準に準拠していないCCSからのフロートの変換を扱っています(符号ビット、指数、仮数の代わりに、指数、符号ビット、仮数を使用します)。>>>演算子を使用して奇妙な動作に遭遇しました。

与えられた

byte byte1=(byte)0x8A;     //10001010
byte byte2=(byte)(byte1>>>1);       //11000101

>>>を挿入することを指定しているのに、0なぜ取得するの1ですか?

これを回避してコーディングし、手動でビットを反転することはできますが、プラットフォーム固有であることを発見したくありません。

4

3 に答える 3

2

Javaでは、シフトが作用する前に、バイトは自動的にintにキャストされます。Codologically、あなたがしていることは以下と同等です:

byte byte2=(byte)(((int)byte1)>>>1);

そしてもちろん、intsignへのキャストも拡張されます。結果を整数のままにすると、(そのときの)期待値は0x7FFFFFC5になります。

これを回避するには、8番目のビットをフラットにマスクします。

byte byte2 = (byte) (byte1 >>> 1 & 0x7F);

関連する質問

この振る舞いは賢明で期待されたものではなく、Javaは素晴らしいものではありませんか?

于 2012-10-02T21:09:51.953 に答える
1

バイトを使用せず、intを使用してください。ただし、次のコードを実行します。

    int int1 = 0x8A;
    System.out.println(formatBinary(int1));
    int int2 = int1 >>> 1;
    System.out.println(formatBinary(int2));

この出力を取得します(無関係なformatBinaryと呼ばれるフォーマット印刷メソッドを使用):

8a: 10001010
45: 01000101
于 2012-10-02T21:09:25.947 に答える
0

バイトではなく、intを使用しています。値は、intシフトインする8番目より1ビット上にある必要があります。

于 2012-10-02T20:50:32.063 に答える