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
我想将前 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