我有一个字节变量:
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