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

在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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值