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 位,这不是我想要的。
有任何想法吗?
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)
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |