【问题标题】:Directly (NOT iteratively) maximizing (1 << n) subject to (a & ~((1 << n) - 1)) >= b直接(非迭代)最大化 (1 << n) 服从 (a & ~((1 << n) - 1)) >= b
【发布时间】:2017-01-07 08:08:58
【问题描述】:

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

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

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

我想知道是否有一种方法可以直接解决这个问题,比如通过某种比特旋转?

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

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

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

【问题讨论】:

  • '所有变量都是正整数'你的意思是所有变量都是unsigned的类型吗?
  • @Marian:当然,为什么不...如果不是,您可以将它们转换为已签名或未签名,这不是真正的问题。
  • 这不等于找到a &amp; ~b的前导位吗?
  • 不是。例如,对于 a == b,n 是 a 中尾随零的数量,但 a & ~b 始终为 0。
  • @user2357112:好点,但我实际上并不太担心那些边缘情况,因为它只是一个检查操作(a == b ? blah : blah)......虽然如果它会很好总是有效。

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


【解决方案1】:
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
  2. 如果 a == b,我们可以清除每个位,直到 a 的最低有效设置位。
  3. 如果 a > b 和 b 设置了低于 a 和 b 之间最重要不匹配位的位,我们可以清除每个位,直到最重要的不匹配位。
  4. 如果 a > b 和 b 在 a 和 b 之间的最高有效不匹配位以下没有设置位,我们可以清除每个位,直到 b 的最低有效设置位。

【讨论】:

  • @Mehrdad:哦,对了,你想要 1
  • 是的,我今天思维不正确,没有注意到 :) 让我再检查一下...
  • 看来你是对的!谢谢!现在看,我想我以前也有类似的东西,但我没有费心去完成它。我可能会尝试清理这个:)
  • 顺便提一下ctz(x)怎么做,因为这有点作弊,因为我没有在问题中说它是允许的。 (您可以通过1 &lt;&lt; ctz(x) = round_down_to_pow2(x &amp; (~x + 1)) 进行操作。)
猜你喜欢
  • 2018-10-21
  • 2015-10-08
  • 2018-08-30
  • 2017-10-30
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
相关资源
最近更新 更多