gpt4 book ai didi

java - 为什么负字节的 Java 无符号位移如此奇怪?

转载 作者:搜寻专家 更新时间:2023-10-31 08:19:31 24 4
gpt4 key购买 nike

我有一个字节变量:

byte varB = (byte) -1; // binary view: 1111 1111

我想查看最左边的两位并进行 6 位的无符号右移:

varB = (byte) (varB >>> 6);

但我得到 -1 就好像它是 int 类型,并且只有当我换30!

我怎样才能解决这个问题并仅通过 6 位数的移位获得结果?

最佳答案

原因是与移位时发生的 int 数字提升相关的符号扩展。值 varB 在移位之前被提升为 int。确实发生了向右的无符号位移位,但是当转换回 byte 时,它的效果会下降,它只保留最后 8 位:

varB (byte)     : 11111111
promoted to int : 11111111 11111111 11111111 11111111
shift right 6 : 00000011 11111111 11111111 11111111
cast to byte : 11111111

您可以使用按位与运算符 & 在移位之前屏蔽不需要的位。使用 0xFF 的位与运算仅保留 8 个最低有效位。

varB = (byte) ((varB & 0xFF) >>> 6);

这是现在发生的事情:

varB (byte)     : 11111111
promoted to int : 11111111 11111111 11111111 11111111
bit-and mask : 00000000 00000000 00000000 11111111
shift right 6 : 00000000 00000000 00000000 00000011
cast to byte : 00000011

关于java - 为什么负字节的 Java 无符号位移如此奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29682355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com