直接(非迭代地)最大化(1< n)受(a&〜((1< n< n)-1))> = b

时间:2017-01-07 08:08:58

标签: c binary bit-manipulation boolean-logic maximize

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

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

迭代地解决这个问题是微不足道的(是的,我知道你可以通过分而治之等获得更好的表现),但这不是我的问题。

我想知道是否有一种方法可以解决直接,就像通过某种程度的纠缠一样?

注1: 假设您可以在一次操作中“向上/向下舍入到最接近2的幂”。 注意2: 如果有必要,您可以假设两个补码表示(但我怀疑这有帮助)。

如果有直接的方式,我可以使用什么技术来解决这个问题?如果没有,我能以某种方式说出来吗?

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

1 个答案:

答案 0 :(得分:3)

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. 如果&lt; b,n的值没有效果。
  2. 如果a == b,我们可以将每一位清除到a。
  3. 的最低有效位
  4. 如果a&gt; b和b的位设置在a和b之间最重要的不匹配位之下,我们可以清除每一位到最重要的不匹配位。
  5. 如果a&gt; b和b在a和b之间的最重要的不匹配位之下没有设置位,我们可以将每个位清除到b的最低有效位。