【问题标题】:Calculate the smallest integer with k bits set that is greater than another integer x?计算设置了 k 位且大于另一个整数 x 的最小整数?
【发布时间】:2012-06-15 19:53:31
【问题描述】:

我想计算恰好设置了k 位的最小整数,它大于另一个整数x

例如如果x = 1001010 那么 对于k=2,答案应该是1010000 对于k=4,答案应该是1001011 对于k=5,答案是1001111

我认为至少需要设置与整数x 中设置的最左侧位一样多的位,然后选择设置与x 中下一个最左侧设置位相邻的 MSB 侧位,或设置下一个最左边的设置位,然后通过重复相同的过程查看设置后面的位;一直在计算 k 中剩下的位数。

我不确定这是否是正确的方法。

【问题讨论】:

  • 提供示例输入/输出将使您的问题更容易理解。你的意思是这两个整数应该设置相同的位数吗?
  • @xvatar 我认为xk都是程序的输入,即x = 1001010k = 2会返回1010000
  • 答案应该包含精确的 k 位集合,还是至少包含 k 位集合?
  • @xvatar 我意识到我的问题应该更清楚。我已进行了适当的更改。
  • @EitanT 不,这不是家庭作业:-)。这是我在解决面试中被问到的一个相关问题时想到的。

标签: c algorithm integer bit-manipulation


【解决方案1】:
++x;

while (popcnt(x) > k)
{
    // Substitute the least-significant group of bits
    // with single bit to the left of them
    x |= x-1;
    ++x;
}

unsigned bit = 1;
while (popcnt(x) < k)
{
    x |= bit;
    bit <<= 1;
}

第二个循环可能会优化:

for (i = k - popcnt(x); i != 0; --i)
{
    // Set the lowest non-set bit
    x |= x+1;
}

【讨论】:

  • @ffao:在 D.Knuth 的“计算机编程艺术,第 4A 卷”中有很多这样的技巧。或"Matters Computational".
  • @EvgenyKluev 感谢您的回答,感谢您向我介绍 gcc popcnt。我对此一无所知,可能会编写一个循环来计算设置的位数。
猜你喜欢
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2020-09-30
  • 1970-01-01
  • 2022-07-22
  • 2022-11-27
相关资源
最近更新 更多