Java中位运算右移>>和>>>的区别

发布时间:2024年01月18日

在Java编程语言中,>> 和 >>> 都是右移运算符,但它们有以下区别:

算术右移(Arithmetic Right Shift, >>):

  • 当对一个有符号整数进行右移时,Java使用的是算术右移。这意味着如果被移位的数值是一个负数,其高位将补1(保持原数的符号位不变),以维持该数的正负性。
  • 对于正数,无论使用 >> 还是 >>>,结果都是一样的,即高位补0。

逻辑右移(Logical Right Shift, >>>):

  • 逻辑右移不会考虑数字的符号位,即使是对负数操作,其高位也会补0。
  • 这个操作对于无符号整数或者当需要将负数当作无符号整数处理时特别有用。在Java中,所有的整数类型都可以通过这种方式看作无符号整数来处理,因为Java没有内置的无符号整数类型。
// 以数字2为例来进一步解释 >>(算术右移)和 >>>(逻辑右移)的区别:

int num = 2; // 十进制表示,二进制为:00000010

// 算术右移(对于正数,算术右移与逻辑右移结果相同)
int arithmeticShifted = num >> 1;
// 结果:1,二进制为:00000001

// 逻辑右移
int unsignedShifted = num >>> 1;
// 结果:1,二进制同样为:00000001

// 以数字-2为例来说明 >>(算术右移)和 >>>(逻辑右移)的区别:

int num = -2; // 十进制表示
// 二进制补码形式为:11111111 11111111 11111111 11111110 (32位)

// 算术右移(对于负数,高位补符号位)
int arithmeticShifted = num >> 1;
// 二进制补码形式为:11111111 11111111 11111111 11111111
// 原码:10000000 00000000 00000000 00000001 结果:-1

// 逻辑右移(无论正负,高位都补0)
int unsignedShifted = num >>> 1;
// 二进制补码形式为:01111111 11111111 11111111 11111111
// 原码:01111111 11111111 11111111 11111111 结果:2^32-1=2147483647

文章来源:https://blog.csdn.net/qq_43478319/article/details/135684869
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。