5

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

例如,如果x = 1001010then for k=2,答案应该是1010000 for k=4,答案应该是1001011 fork=5答案是1001111

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

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

4

1 回答 1

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;
}
于 2012-06-15T20:39:49.197 回答