java 中的右移运算符
Right shift operator in java
public class Operator {
public static void main(String[] args) {
byte a = 5;
int b = 10;
int c = a >> 2 + b >> 2;
System.out.print(c); //prints 0
}
}
当5右移2位是1,10右移2位是2那么相加就是3对吗?怎么打印出来0我调试也看不懂
一切都是为了 operator precedence。加法运算符优先于移位运算符。
您的表达方式与:
int c = a >> (2 + b) >> 2;
JavaDocs 中提供的这个 table 将帮助您理解 Java
中的运算符优先级
additive + - /\ High Precedence
||
shift << >> >>> || Lower Precedence
所以你的表情会是
a >> 2 + b >> 2;
a >> 12 >> 2; // hence 0
这是你想要的吗?
int c = ((a >> 2) + b) >> 2;
你向右移动了 2+b。我假设你想将 5 个位置移动 2 个位置,对吗?
b000101 >> 2 == b0001øø
| |___________________|_|
| |
|_____________________|
即最左边的位向右移动 2 个位置,最右边的位也向右移动(但它的右侧没有更多有效位置,所以它就消失了),数字变成剩下的 - 在本例中为“1”。如果将数字 5 移动 12 个位置,您将得到零,因为 5 在二进制形式中的位置少于 12 个。在 '5' 的情况下,如果你想保留非零值,你最多可以移动 2 个位置。
public class Operator {
public static void main(String[] args) {
byte a = 5;
int b = 10;
int c = a >> 2 + b >> 2;
System.out.print(c); //prints 0
}
}
当5右移2位是1,10右移2位是2那么相加就是3对吗?怎么打印出来0我调试也看不懂
一切都是为了 operator precedence。加法运算符优先于移位运算符。
您的表达方式与:
int c = a >> (2 + b) >> 2;
JavaDocs 中提供的这个 table 将帮助您理解 Java
中的运算符优先级additive + - /\ High Precedence
||
shift << >> >>> || Lower Precedence
所以你的表情会是
a >> 2 + b >> 2;
a >> 12 >> 2; // hence 0
这是你想要的吗?
int c = ((a >> 2) + b) >> 2;
你向右移动了 2+b。我假设你想将 5 个位置移动 2 个位置,对吗?
b000101 >> 2 == b0001øø
| |___________________|_|
| |
|_____________________|
即最左边的位向右移动 2 个位置,最右边的位也向右移动(但它的右侧没有更多有效位置,所以它就消失了),数字变成剩下的 - 在本例中为“1”。如果将数字 5 移动 12 个位置,您将得到零,因为 5 在二进制形式中的位置少于 12 个。在 '5' 的情况下,如果你想保留非零值,你最多可以移动 2 个位置。