Java中关于无符号右移的问题 (~0L>>>-5)当右边为负数的情况

Java无符号右移负数详解:~0L>>>-5
这篇博客探讨了在Java中遇到的一个罕见情况,即无符号右移(>>>)操作符与负数相结合的问题。作者通过~0L>>>-5的表达式为例,指出在Java的开发实践中这种用法并不常见,并分享了从知乎和优快云上收集的解答总结。
今天  远哥突然问了一个问题  System.out.println((~0L << 2) &(~0L >>> -5));

这个问题中出现了一个以前不常见的一种情况  就是(~0L >>> -5)  这个问题中

无符号右移出现了右边操作数是负数的情况  这种情况Java开发这么多年几乎没有遇到过

赶紧上网查找  知乎大神和优快云大神都做出来回答  我在这里总结出来:


Chapter 15. Expressions
If the promoted type of the left-hand operand is int, then only the five lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & ( §15.22.1) with the mask value 0x1f (0b11111). The shift distance actually used is therefore always in the range 0 to 31, inclusive.
这个是Java原始文档中的一段话   说的就是  所有的右边操作数为负数的情况都等同于取该操作数补码的后面5位于
0b11111逻辑与   在我这个问题中也就是:   -5的补码:11111011后面五位即
11011&0b11111  后得到11011  也就是27  相当于无符号右移-5位就相当于无符号右移27位

在这道题中 0L是一个long类型  占用4个字节  也就是32位   得到补码后无符号右移27位就得到
11111  也就是31  经过验证  符合情况

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值