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

dae*_*lus 0 java bits bit-manipulation

我想将前 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;
Run Code Online (Sandbox Code Playgroud)

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

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

我尝试使用 newByte |= oldByte 但它传输的设置位超出了第 3 位,这不是我想要的。

有任何想法吗?

Sam*_*tep 5

byte newByte = (byte) (oldByte & 0b111);
Run Code Online (Sandbox Code Playgroud)

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

如果您想从 oldByte 中获取前n位而不是前 3 位,您可以执行以下操作:

byte newByte = (byte) (oldByte & ((1 << n) - 1));
Run Code Online (Sandbox Code Playgroud)

示例时n == 3

(1 << n) - 1
(1 << 3) - 1
0b1000 - 1
0b111
Run Code Online (Sandbox Code Playgroud)