我想计算设置了k
位的最小整数,大于另一个整数x
。
例如,如果x = 1001010
那么
对于k=2
,答案应为1010000
对于k=4
,答案应为1001011
对于k=5
,答案是1001111
我认为需要设置至少与整数x
中设置的最左位一样多的位,然后在{{中的下一个最左侧设置位旁边设置MSB侧位)之间进行选择。 1}},或设置下一个最左边的设置位,然后通过重复相同的过程来查看设置后面的位;一直计算从k中留下的位。
我不确定这是否是正确的方法。
答案 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;
}