1

次のコード(byteIndexはint)について考えてみます。

int bitNumber = b-(8*byteIndex);
bitMask = 0x8>>(byte)bitNumber;

これによりエラーが発生します

error: possible loss of precision

コンパイル時(必須バイト、intが見つかりました)。

コード

int bitNumber = b-(8*byteIndex);
bitMask = 0x8>>2;

正常にコンパイルされます。

ここでの問題は何ですか?int値によるビットシフトを可能にするために最初の例を修正するにはどうすればよいですか?

編集:コメントに続いて、ここにもっと完全な例があります:

48) int byteIndex;
49) byte bitMask;
50) int bitNumber;
    // assign value to byteIndex
67) bitNumber = b-(8*byteIndex);
68) bitMask = 0x8>>bitNumber;

与えられたエラーは次のとおりです。

...MyClass.java:68: error: possible loss of precision
    bitMask = 0x8>>bitNumber;
             ^
  required: byte
  found:    int
1 error
4

3 に答える 3

9

あなたの行をこれに変換してくださいshifting: -

byte bitMask = (byte)(0x8>>(byte)bitNumber);

RHS は int です。バイトに型キャストする必要があります。

上記のコードは正常に動作します.. to の有無にかかわらcastingbitNumberbyte

だから、あなたも持つことができます: -

byte bitMask = (byte)(0x8>>bitNumber);

しかし、ここに質問があります-byte bitMask = 0x8>>3;正常に動作します..なぜそうなのですか??

その動作の背後にある理由と動作を説明するいくつかの例を次に示しますfinal: -

byte bitMask;
int varInt1 = 3;
final int finalVarInt2 = 3;
final int finalVarInt3 = 4;

bitMask = 0x8>>varInt1;    // 1. Will not work. 
bitMask = 0x8<<3;          // 2. Will work

bitMask = 0x8<<4;          // 3. Will not work
bitMask = 0x8<<finalVarInt2;   // 1. Will work
bitMask = 0x8<<finalVarInt3;   // 2. Will not work

上記の動作を説明する理由は次のとおりです。

  • RHS の値は、コンパイラがLHStypecastedの変数にその値を格納できると確信している場合にのみ、暗黙的に存在します。私たちのためにそれをしてください..byteExplicit type casting

ここで、すべてのケースを 1 つずつ考えてみましょう (上記のコード (1-3, 1-2) から: -

  1. varInt1最初は3が含まれています。したがって、RHSの値は64と評価されます。この値はLHSbyteの変数に適応する可能性がありますが、コンパイラーもそれを認識しているため、..の値を変更することが可能です。したがって、ある段階での値が4に変更された場合..その場合は機能しません..なぜ許されないのか..varInt1varInt1
  2. さて、この場合、Integer Literalここで明示的に使用したため、コンパイラは..に対応することを確信していbyteます。したがって、implicitキャスト..
  3. 繰り返しますが、この場合、 は..に対応できないRHSと評価されることが知られています..再び失敗しました..128byte

最後の 2 つのケースは通常の変数とは異なります...宣言されているため、final再初期化することはできません..したがって、コンパイラは割り当てられた値に基づいて決定を下すことができます..

  1. この場合、コンパイラは、finalVarInt23が含まれていることを確認します。したがって、RHSは64と評価され、これはLHSbyteの変数に格納できます。さて、変数は変更できないので、それを知っているので、t*彼の値は常に*.. であることが確実です。したがって、コンパイラはこれを許可します。finalCompiler64

  2. 最後のケースでは、 の値finalVarInt3は 4 です.. 同様の理由.. RHSは128に評価されるため、 LHSには適合しません。byte

于 2012-09-28T12:03:29.530 に答える
1

最初の例では、bitnumber は int (32 ビット) であり、バイト (8 ビット) としてキャストすると、上位 24 ビットが失われます。したがって、精度が失われています。キャスト (バイト) をオフのままにします。

于 2012-09-28T11:57:21.203 に答える
0

実際、これは答えではありません。正しい答えはRohit Jainが書いたものですが、JVMのそのような動作を見たのはこれが初めてです。これらのコードを比較してください。

最終bitNumberとしてマークされているバージョン

final int bitNumber = 10;
final byte bitMask = 0x8 >> bitNumber;

bitNumber最終版ではないバージョン

int bitNumber = 10;
bitNumber = 10;
final byte bitMask = 0x8 >> bitNumber;

そして、2番目の例にはエラーがあります。おそらく何らかの最適化です。誰かが理由を知っていれば素晴らしいでしょう;-)

于 2012-09-28T12:23:37.673 に答える