我已经有一段时间进行位操作了,我不确定这是否可以以更有效的方式完成。
我想要的是从一个值中获取特定范围的位。
假设该值的二进制为:0b1101101
现在我想以二进制补码形式获取该值的第 2 位到第 5 位的 4 位范围。
我想要得到的范围:0b1011
二进制补码值:-5
这是我的代码,以及我正在做的一些想法:
public int bitRange(int value, int from, int to) {
// cut the least significant bits
value = value >> from;
// create the mask
int mask = 0;
for (int i = from; i <= to; i++) {
mask = (mask << 1) + 1;
}
// extract the bits
value = value & mask;
// needed to check the MSB of the range
int msb = 1 << (to - from);
// if MSB is 1, XOR and inverse it
if ((value & msb) == msb ) {
value = value ^ mask;
value = ~value;
}
return value;
}
现在我想知道这样是否可以做得更有效?特别是动态掩码的创建和范围的 MSB 检查,以便能够转换位范围。另一点是,正如 user3344003 正确指出的那样,如果范围是 1 位,则输出将为 -1
。我确信还有可能的改进。
最佳答案
对于你的面具,你可以这样做
int mask = 0xffffffff >> 32-(to-from);
尽管该代码准确正确的可能性很小。可能相差一位,边缘问题,标志问题。但这是在正确的轨道上吗?
关于java - 让给定范围的位更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26500800/