逻辑或非符号右移位运算符>>>主要作用于位图,而不是一个值的算术意义;它总是将零置于最重要的位上。例如:
1010 ... >> 2 gives 111010 ...
1010 ... >>> 2 gives 001010 ...在移位的过程中, >>运算符使符号位被拷贝。注意──移位运算符将它们右侧的操作数模32简化为int类型左侧操作数, 模64简化为long类型右侧操作数。因而, 任何int x, x >>> 32都会导致不变的x值, 而不是你可能预计的零。注意------值得称赞的重要一点是: >>>运算符仅被允许用在整数类型, 并且仅对int和long值有效。如果用在short或byte值上, 则在应用>>>之前, 该值将通过带符号的向上类型转换被升级为一个int。有鉴于此,无符号移位通常已成为符号移位。
1010 ... >> 2 gives 111010 ...
1010 ... >>> 2 gives 001010 ...在移位的过程中, >>运算符使符号位被拷贝。注意──移位运算符将它们右侧的操作数模32简化为int类型左侧操作数, 模64简化为long类型右侧操作数。因而, 任何int x, x >>> 32都会导致不变的x值, 而不是你可能预计的零。注意------值得称赞的重要一点是: >>>运算符仅被允许用在整数类型, 并且仅对int和long值有效。如果用在short或byte值上, 则在应用>>>之前, 该值将通过带符号的向上类型转换被升级为一个int。有鉴于此,无符号移位通常已成为符号移位。
public class URShift {
public static void main(String[] args) {
int a = -1;
a >>>= 10;
System.out.println(a);
}
}结果是4194303
能不能告诉我这个记过怎么出来的?
这样最左位是 0 ,它是个正数。为了保持它还是负数,所以用 >>> 这样上面的结果是 10100001011最左位保持 1
11111111111111111111111111111110>>>10时,第一位的符号位及后面的一起向右移动10位,以0来填补。
00000000001111111111111111111111
结果为4百多万。