直接(不迭代地)最大化 (1 << n) 服从 (a & ~((1 << n) - 1)) >= b

Directly (NOT iteratively) maximizing (1 << n) subject to (a & ~((1 << n) - 1)) >= b

我试图找到满足这个不等式的最大1 << n(所有变量都是正整数):

a & ~((1 << n) - 1) >= b

迭代解决这个问题很简单(是的,我知道你可以通过分而治之等方法获得更好的性能),但这不是我的问题。

我想知道是否有办法直接解决这个问题,比如通过某种位运算?

注1:假设你可以在一次操作中做到"round up/down to the closest power of 2"。
注2:如有必要,您可以假定二进制补码表示(但我怀疑这是否有帮助)。

如果有直接的方法,我可以使用什么技术来解决这个问题?如果没有,我能告诉你吗?

我已经尝试了很多东西,比如 XORing ab,将结果四舍五入到 2 的下一个幂等,但我最终没有找到任何好的东西总是有效。

if (a < b) {
    oops();
} else if (a == b) {
    return ctz(a);
} else {
    // most significant mismatching bit - must be set to 1 in a and 0 in b
    int msmb = round_down_to_power_of_2(a ^ b);
    if (b & (msmb - 1)) {
        return ctz(msmb);
    } else {
        return ctz(b);
    }
}

我们有 4 个案例:

  1. 如果 a < b,则 n 的值无效。
  2. 如果 a == b,我们可以清除每一位,直到 a 的最低有效设置位。
  3. 如果 a > b 并且 b 设置了低于 a 和 b 之间最重要不匹配位的位,我们可以清除直到最重要不匹配位的所有位。
  4. 如果 a > b 并且 b 在 a 和 b 之间的最高有效不匹配位之下没有设置位,我们可以清除所有位,直到 b 的最低有效设置位。