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

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

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

我认为需要设置至少与整数x设置的最左位一样多的位,然后在x设置与下一个最左边设置位相邻的MSB侧位或者设置下一个最左边的设置位之间进行选择然后通过重复相同的过程来查看设置后面的位; 一直计算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; }