java,在一次操作中将前 3 位从一个字节传输到另一个字节

java, transfer first 3 bits from one byte to another in a single operation

我想将前 3 位从一个字节传输到另一个字节。目前我使用以下但它太慢了(不正确的分支预测减慢了速度)>

    byte newByte = 0;
    if(((oldByte >> 0)&1) == 1)  newByte |= 1 << 0;
    if(((oldByte >> 1)&1) == 1)  newByte |= 1 << 1;
    if(((oldByte >> 2)&1) == 1)  newByte |= 1 << 2;

如何在没有 if 语句或循环的情况下在单个操作中执行此操作?

注意:第 3 位以外的其他位可能会或可能不会在 oldByte 中设置,但我想忽略它们。

我尝试使用 newByte |= oldByte,但它会将设置的位传输到第 3 位之外,这不是我想要的。

有什么想法吗?

byte newByte = (byte) (oldByte & 0b111);

会成功的。这是有效的,因为 0b111 作为掩码,所以只有 oldByte 中最右边的三位在执行计算后会保留其原始值; oldByte 中的其余位将设置为 0。然后将结果分配给 newByte。您需要将结果转换为 byte,因为按位 & 运算符会产生一个 int,它比 byte 大,因此必须进行转换才能正确转换。

如果你想从 oldByte 中获取前 n 位而不是前 3 位,你可以这样做:

byte newByte = (byte) (oldByte & ((1 << n) - 1));

示例 n == 3:

(1 << n) - 1
(1 << 3) - 1
0b1000 - 1
0b111