あなたの行をこれに変換してくださいshifting
: -
byte bitMask = (byte)(0x8>>(byte)bitNumber);
RHS は int です。バイトに型キャストする必要があります。
上記のコードは正常に動作します.. to の有無にかかわらcasting
ずbitNumber
byte
だから、あなたも持つことができます: -
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 の値は、コンパイラがLHS
typecasted
の変数にその値を格納できると確信している場合にのみ、暗黙的に存在します。私たちのためにそれをしてください..byte
Explicit type casting
ここで、すべてのケースを 1 つずつ考えてみましょう (上記のコード (1-3, 1-2) から: -
varInt1
最初は3が含まれています。したがって、RHSの値は64と評価されます。この値はLHSbyte
の変数に適応する可能性がありますが、コンパイラーもそれを認識しているため、..の値を変更することが可能です。したがって、ある段階での値が4に変更された場合..その場合は機能しません..なぜ許されないのか..varInt1
varInt1
- さて、この場合、
Integer Literal
ここで明示的に使用したため、コンパイラは..に対応することを確信していbyte
ます。したがって、implicit
キャスト..
- 繰り返しますが、この場合、 は..に対応できない
RHS
と評価されることが知られています..再び失敗しました..128
byte
最後の 2 つのケースは通常の変数とは異なります...宣言されているため、final
再初期化することはできません..したがって、コンパイラは割り当てられた値に基づいて決定を下すことができます..
この場合、コンパイラは、finalVarInt2
値3が含まれていることを確認します。したがって、RHSは64と評価され、これはLHSbyte
の変数に格納できます。さて、変数は変更できないので、それを知っているので、t*彼の値は常に*.. であることが確実です。したがって、コンパイラはこれを許可します。final
Compiler
64
最後のケースでは、 の値finalVarInt3
は 4 です.. 同様の理由.. RHSは128に評価されるため、 LHSには適合しません。byte