📜  给定范围内的未设置位(1)

📅  最后修改于: 2023-12-03 15:41:17.728000             🧑  作者: Mango

给定范围内的未设置位

在程序开发中,我们经常需要查询一个整型数中未设置的位。这里我们介绍几种方法来查找给定范围内的未设置位。

方法1:循环查询

通过循环来遍历每个位,判断每个位是否被设置。

public static void findUnsetBits(int n, int low, int high) {
    for (int i = low; i <= high; i++) {
        if ((n & (1 << i)) == 0) {
            System.out.println(i + " 未设置");
        }
    }
}

该方法的时间复杂度为O(w),其中w是整型数的位数,因为我们需要遍历整型数的每个位。当然,如果给定范围较小,那么时间复杂度会更低。

方法2:位运算

我们可以使用位运算来直接查找给定范围内的未设置位。

首先,我们将2的low次方减去1,然后将这个值左移high次,得到一个掩码,此掩码可以将给定范围内的所有位设置为1。

int mask = ((1 << (high - low + 1)) - 1) << low;

然后,我们将整型数n和掩码取异或,得到一个值,该值的二进制表示中为1的位表示在给定范围内被设置了,为0的位表示未被设置。

int unsetBits = (n ^ mask);

最后,我们可以对unsetBits进行遍历,查找未设置位的位置。

for (int i = low; i <= high; i++) {
    if ((unsetBits & (1 << i)) != 0) {
        System.out.println(i + " 未设置");
    }
}

这种方法的时间复杂度为O(1),无论给定范围多大,时间复杂度都不会改变。

总结

以上是两种常见的查找给定范围内的未设置位的方法,每种方法都有其优缺点。

如果给定范围较小,我们可以使用第一种方法。如果范围较大,我们应该使用第二种方法,以避免不必要的时间和空间消耗。