**本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接 **
问题
Java中>>>与>>操作符有什么区别?
------------------------------以下为回答,按支持票数排序----------------------------------
回答1(支持票数450):
>>
是算术右移,>>>
是逻辑右移。
在算术移位中,将扩展符号位以保留数字的符号性。
例如:用8位表示-2将是11111110(因为最高有效位的权重为负)。使用算术移位>>
将其向右移一位,您将得到11111111或-1。但是,逻辑上的右移并不关心该值是否可能表示一个带符号的数字。它只是将所有内容移至右侧,并从左侧填充0。使用逻辑移位将-2右移一位将得到01111111。
回答2(支持票数107):
>>>
无符号移位;它将插入0。>>
是有符号的,并将扩展符号位。
移位运算符包括左移
<<
,有符号右移>>
和无符号右移>>>
。
n>>s
的结果是带符号的n向右移位s
位n
>>>
s的结果是无符号的n向右移位s
位。
System.out.println(Integer.toBinaryString(-1));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >> 16));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >>> 16));
// prints "1111111111111111"
更清晰的表达:
System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"
由于它为正,有符号和无符号移位都将在最左边的位加0。
回答3(支持票数50):
他们都是右移,但>>>
为无符号右移
从文档中:
无符号右移运算符“ >>>”将一个无符号移位到最左位置,而“ >>”之后的最左位置取决于符号位。