计算设置的k位大于另一个整数x的最小整数?

时间:2012-06-15 19:53:32

标签: c algorithm integer bit-manipulation

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

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

我认为需要设置至少与整数x中设置的最左位一样多的位,然后在{{中的下一个最左侧设置位旁边设置MSB侧位)之间进行选择。 1}},或设置下一个最左边的设置位,然后通过重复相同的过程来查看设置后面的位;一直计算从k中留下的位。

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

1 个答案:

答案 0 :(得分:6)

++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;
}