我有一个字节变量:

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

我想查看最左边的两个位,并执行6位无符号右移:
varB = (byte) (varB >>> 6);

但是我得到的是 -1 ,就好像它是int类型一样,只有当我移动30时才得到 3 !

我如何解决此问题并仅获得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掩盖移位之前不需要的位。使用ojit_code进行位与运算仅保留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

10-07 16:35