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

标签 c binary bit-manipulation boolean-logic maximize

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

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

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

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

注意 1:假设您可以在一次操作中执行“向上/向下舍入到最接近 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 的最低有效设置位。

关于c - 直接(不迭代地)最大化 (1 << n) 服从 (a & ~((1 << n) - 1)) >= b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41519298/

相关文章:

c - C中数学计算的库是什么?

powershell - 如何使用PowerShell在大的二进制文件中查找和替换?

c# - 将可标记枚举映射到数组

python - 在 Python 中使用 0xFFFFFFFF 掩码检测 int32 溢出?

c++ - 0x5DF9CCC8 处未处理的异常

c - 这个表达式 `n = (n<<3)+(n<<1) + ch-' 0', ch=getchar_unlocked();` 的实际含义是什么?

c++ - For 循环与赋值运算符

c++ - 是否有用于 C 或 C++ 的高级形状绘图 API?

arrays - 结构体数组成员地址问题

c - UDP 多客户端聊天服务器