我要计算与完全最小整数k
设置位,比另一个整数更大的x
。
例如,如果x = 1001010
则对于k=2
,答案应该是1010000
为k=4
,答案应1001011
和k=5
的回答为1001111
我认为,一个需要设置至少一样多的位在整数设置的最左边位x
,然后设置MSB侧比特相邻的下一个最左边之间选择设置位x
,或将下一个最左边的设置位然后看设置继比特通过重复相同的过程; 所有的同时计数位留出了k的。
我不知道这是否是正确的做法。
我要计算与完全最小整数k
设置位,比另一个整数更大的x
。
例如,如果x = 1001010
则对于k=2
,答案应该是1010000
为k=4
,答案应1001011
和k=5
的回答为1001111
我认为,一个需要设置至少一样多的位在整数设置的最左边位x
,然后设置MSB侧比特相邻的下一个最左边之间选择设置位x
,或将下一个最左边的设置位然后看设置继比特通过重复相同的过程; 所有的同时计数位留出了k的。
我不知道这是否是正确的做法。
++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;
}