有一个意思
byte b1 = (byte) 0xE2; //1110 0010
从这里你需要得到值 7(十进制)// 0111
我尝试向右移动 5 位,结果是 0xFF。
int result = b1 >> 5; // = 0xFF. А по идеи должно было получится 0000 0111 (значение 7 DEC)
告诉我出了什么事?
我使用 BetSet 得到了正确的结果。
BitSet result = getBitSet(new byte[] { b1 }, 0, 5, 3);
int dec = Arrays.copyOf(result.toByteArray(), 1)[0]; // = 7. b1 не всегда 0xE7, может быть и 0x2 и т.д. т.е. в этом случае в получаем просто 0
public static BitSet getBitSet(byte[] array, int fromByteIndex, int fromByteBitIndex, int bitsCount) {
BitSet arrayBitSet = BitSet.valueOf(array);
int fromIndex = fromByteIndex * 8 + fromByteBitIndex;
return arrayBitSet.get(fromIndex, fromIndex + bitsCount);
}
>>
- 算术移位运算符 (SAR),它传播符号位,在这种情况下为 1但在 Java 中还有一个运算符
>>>
(逻辑或无符号移位)将用零填充空出的空间由于将字节转换为 int 填充为 1,因此您可以将中间结果的高位部分设置为零。
根据任务的不同,在最后施加一个三位掩码 7 可能更容易。
Java 中的字节不能移动。因此,它首先被填充到 int 中。在你的情况下,单位,因为 字节中的第一位是一个。正是这些单位在最终值中出现。
有用的链接: 移位如何在 Java 中工作。