Java中的>>>和>>操作符有什么区别?
当前回答
它们都是右移,但是>>>是无符号的
从文档中可以看到:
无符号右移运算符“>>>”将0移到最左边的位置,而“>>”之后的最左边位置取决于符号扩展。
其他回答
右移逻辑运算符(>>> N)将位右移N位,丢弃符号位,并用0填充最左边的N位。例如:
-1 (in 32-bit): 11111111111111111111111111111111
>>> 1操作后:
2147483647: 01111111111111111111111111111111
右移算术运算符(>> N)也将位右移N位,但保留符号位并将最左边的N位填充为1。例如:
-2 (in 32-bit): 11111111111111111111111111111110
>> 1操作后变为:
-1: 11111111111111111111111111111111
阅读更多关于按位和位移位操作符
>> Signed right shift
>>> Unsigned right shift
位模式由左操作数给出,而右操作数要移位的位置数。无符号右移运算符>>>将0移到最左边的位置,
而>>之后最左边的位置取决于符号扩展。
简单地说,>>>总是将0移到最左边的位置,而>>则根据数字的符号进行移动,即1表示负数,0表示正数。
例如,尝试用负数和正数。
int c = -153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.println(Integer.toBinaryString(c <<= 2));
System.out.println();
c = 153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
输出:
11111111111111111111111111011001
11111111111111111111111101100100
111111111111111111111111011001
11111111111111111111111101100100
100110
10011000
100110
10011000
>>>是unsigned-shift;它会插入0。>>是有符号的,将扩展符号位。
JLS 15.19 Shift运算符
移位操作符包括左移位<<,有符号右移位>>,无符号右移位>>>。 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。
相关问题
右移执行在-1上除以2 在Java中移位比特比乘除快吗?net ? c/c++在Java中' >>> '的等效方式是什么(无符号右移) 负逻辑位移 Java的>> vs >>>操作员? Java操作符>>和>>>有什么区别? >>>和>>操作符的区别 为什么像c# /Java这样的高级语言会屏蔽位移位计数操作数? 1 >>> 32 == 1
>> Signed right shift
>>> Unsigned right shift
例子:-
byte x, y; x=10; y=-10;
SOP("Bitwise Left Shift: x<<2 = "+(x<<2));
SOP("Bitwise Right Shift: x>>2 = "+(x>>2));
SOP("Bitwise Zero Fill Right Shift: x>>>2 = "+(x>>>2));
SOP("Bitwise Zero Fill Right Shift: y>>>2 = "+(y>>>2));
输出将是:-
Bitwise Left Shift: x<<2 = 40
Bitwise Right Shift: x>>2 = 2
Bitwise Zero Fill Right Shift: x>>>2 = 2
Bitwise Zero Fill Right Shift: y>>>2 = 1073741821
>>是算术右移,>>>是逻辑右移。
在算术移位中,符号位被扩展以保持数字的有号性。
例如:用8位表示的-2将是11111110(因为最高位的权值为负)。用算术移位向右移动一位,就会得到11111111,或者-1。然而,逻辑右移并不关心该值是否可能表示有符号的数字;它只是把所有东西都移到右边,然后从左边填上0。使用逻辑移位将-2右移一位将得到01111111。
推荐文章
- 为什么在Java和。net中不能修改字符串?
- java.util.Random真的那么随机吗?我怎么能生成52!(阶乘)可能的序列?
- ZoneOffset之间的区别是什么。UTC和ZoneId.of(“UTC”)?
- 类未找到:IntelliJ中的空测试套件
- 将JAR文件添加到Spark作业- Spark -submit
- REST API - dto还是不是?
- JavaFX应用程序图标
- Java:强/软/弱/幻影引用的区别
- 在序列化和反序列化期间JSON属性的不同名称
- 获取Android设备名称
- Gradle代理配置
- 静态隐式运算符
- 如何获得具有已知资源名称的资源id ?
- 在Android上将字符串转换为整数
- 为什么“System.out。”println“工作在Android?