Java中按位运算符和位移位的有趣行为返回值
所以我遇到了一个关于按位运算符和位移位的奇怪行为。我试图通过使用位掩码更快地进行小检查,我遇到了这个:
public class Weirdness {
private final static int constant = 3;
private static int notConstant = 3;
public void stuff() {
byte a = 0b1 << 3;
byte b = 0b1 << (int) 3;
byte c = 0b1 << constant;
byte d = 0b1 << notConstant; //error
byte e = 0b1 << getAnInt(); //error
byte f = 0b1 << getAFinalInt(); //error
int i = 3;
byte g = 0b1 << i; //error
final int j = 3;
byte h = 0b1 << j;
}
public static int getAnInt() {
return 3;
}
public static final int getAFinalInt() {
return 3;
}
}
a
, ,并且不给出编译错误;但是, 和 做。编译器要求显式转换为 或将最后一个变量声明为 。我注意到比特瓦兹和也有类似的行为。b
c
h
d
e
f
g
byte
int
&
|
有人能解释一下这里发生了什么吗?编译器为 、 和 工作工作具有什么样的魔力?a
b
c
h
编辑:或者这如何不完全是重复的
我相信这个问题是不同的,因为为什么我不能添加两个字节并得到一个int,我可以添加两个最后一个字节得到一个字节?因为导致有趣的行为的是编译器如何优化bitwize移位操作。
由于我寻求一个理论上的答案(因为我已经明白我可以通过强制转换来编译我的代码)来决定移位和其他bitwize操作如何确定它们的返回值,我相信这个问题可以补充Java - 位移位与整数和字节,并为StackOverflow带来更多有趣的信息。