java - 让给定范围的位更有效?

标签 java bit-manipulation twos-complement

我已经有一段时间进行位操作了,我不确定这是否可以以更有效的方式完成。

我想要的是从一个值中获取特定范围的位。
假设该值的二进制为: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/

相关文章:

c - 如何在C中交换半字节?

python - 在 Python 中取 int 的 2 次方模数的首选方法是什么

java - 启动接收器不工作

javascript - 将 Javascript 数组匹配到 Java 列表

java - 什么是NullPointerException,我该如何解决?

c++ - C++中的十六进制到字符串的转换

在 C 中使用按位运算符将 ASCII 字符串转换为整数,反之亦然

java - 实现 AnimationListener 抽象方法

assembly - 长整数的二进制补码

c - sscanf 处理最大无符号整数值的方式与赋值不同