将您的shifting
行转换为: -
byte bitMask = (byte)(0x8>>(byte)bitNumber);
您的 RHS 是一个 int,您需要将其类型转换为字节 ..
上面的代码可以正常工作.. 有或casting
没有bitNumber
tobyte
因此,您还可以拥有:-
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
以下是解释上述行为的一些推理: -
typecasted
只有当编译器确定它能够在 LHS 上的变量中容纳该值时,RHS 上的值才会是隐式的byte
。否则,我们必须Explicit type casting
告诉编译器,我们知道我们在做什么,只为我们做..
现在让我们一一考虑所有情况(从上面的代码(1-3、1-2):-
varInt1
最初包含3。所以RHS的值计算为64。虽然这个值可能会适应LHS中byte
的变量,但编译器也知道,可以改变 .. 的值。那么如果在某个阶段将 ..为什么不允许..varInt1
varInt1
- 现在,在这种情况下,由于我们在
Integer Literal
这里明确使用了 an,所以编译器确信它会适应byte
.. 所以它允许implicit
强制转换 ..
- 同样,在这种情况下,已知
RHS
将评估128
哪个不能容纳在byte
..再次失败..
最后两种情况与常规变量不同...由于它们已声明final
,因此无法重新初始化..因此,编译器可以根据分配的值做出决定..
在这种情况下,编译器会看到,finalVarInt2
包含值3。因此,RHS的计算结果为64,可以容纳在LHSbyte
上的变量中。现在,由于变量是不能更改的,并且知道这一点,因此可以确定 t*他的值将始终为*.. 所以编译器允许这样做。final
Compiler
64
在最后一种情况下,值为finalVarInt3
4.. 类似的推理.. 不适合LHS,因为RHS评估为128不适合byte