Java中的>>>和>>操作符有什么区别?
当前回答
>> 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
其他回答
它们都是右移,但是>>>是无符号的
从文档中可以看到:
无符号右移运算符“>>>”将0移到最左边的位置,而“>>”之后的最左边位置取决于符号扩展。
>> 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,-8 >> 2。
右移8
8 = 1000(二进制)
执行2位右移
8 >> 2:
1000 >> 2 = 0010(相当于2)
右移-8
8 = 1000(二进制)
1的补码= 0111
2的补充:
0111 + 1 = 1000
符号位= 1
执行2位右移(对2的co结果)
8 >> 2:
1000 >> 2 = 1110(相当于-2)
>>(unsigned)将给你相同的结果为8 >>> 2,-8 >>> 2。
8的无符号右移
8 = 1000
8 >>> 2 = 0010
无符号右移-8
Minus 8 is 1,000
-8 >>> 2 = 0010
>>是算术右移,>>>是逻辑右移。
在算术移位中,符号位被扩展以保持数字的有号性。
例如:用8位表示的-2将是11111110(因为最高位的权值为负)。用算术移位向右移动一位,就会得到11111111,或者-1。然而,逻辑右移并不关心该值是否可能表示有符号的数字;它只是把所有东西都移到右边,然后从左边填上0。使用逻辑移位将-2右移一位将得到01111111。
逻辑右移(v >>> n)返回一个值,其中v中的位向右移动了n位,0从左侧移动。考虑移位8位的值,用二进制写:
01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000
如果我们将位解释为无符号非负整数,逻辑右移的效果是将该数字除以相应的2次方。然而,如果数字是二补表示,逻辑右移不能正确地除负数。例如,当比特被解释为无符号数字时,上面的第二个右移将128移到32。但是,当二进制位被解释为二进制补位时(这在Java中很典型),它会将-128转换为32。
因此,如果你为了除以2的幂而移动,你需要算术右移(v >> n)。它返回一个值,其中v中的位向右移动了n位,并且v中最左边的位的副本从左边移动:
01111111 >> 2 = 00011111
10000000 >> 2 = 11100000
当二进制位是二补表示的数字时,算术右移的效果是除以2的幂。这是因为最左边的位是符号位。除以2的幂必须保持符号不变。
推荐文章
- 为什么在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?