今天 远哥突然问了一个问题 System.out.println((~0L << 2) &(~0L >>> -5));
0b11111逻辑与 在我这个问题中也就是: -5的补码:11111011后面五位即
11011&0b11111 后得到11011 也就是27 相当于无符号右移-5位就相当于无符号右移27位
在这道题中 0L是一个long类型 占用4个字节 也就是32位 得到补码后无符号右移27位就得到
11111 也就是31 经过验证 符合情况
这个问题中出现了一个以前不常见的一种情况 就是(~0L >>> -5) 这个问题中
无符号右移出现了右边操作数是负数的情况 这种情况Java开发这么多年几乎没有遇到过
赶紧上网查找 知乎大神和优快云大神都做出来回答 我在这里总结出来:
Chapter 15. Expressions
这个是Java原始文档中的一段话 说的就是 所有的右边操作数为负数的情况都等同于取该操作数补码的后面5位于
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.
0b11111逻辑与 在我这个问题中也就是: -5的补码:11111011后面五位即
11011&0b11111 后得到11011 也就是27 相当于无符号右移-5位就相当于无符号右移27位
在这道题中 0L是一个long类型 占用4个字节 也就是32位 得到补码后无符号右移27位就得到
11111 也就是31 经过验证 符合情况
这篇博客探讨了在Java中遇到的一个罕见情况,即无符号右移(>>>)操作符与负数相结合的问题。作者通过~0L>>>-5的表达式为例,指出在Java的开发实践中这种用法并不常见,并分享了从知乎和优快云上收集的解答总结。
1610

被折叠的 条评论
为什么被折叠?



