您的位置:首页 > 其它

《Cracking the Coding Interview》——第5章:位操作——题目3

2014-03-19 06:15 447 查看
2014-03-19 05:57

题目:给定一个整数N,求出比N大,而且二进制表示中和N有相同个数的‘1’的最小的数,比如3是‘11’,接下来的5是‘101’,再接下来的6是‘110’。

解法:从低位往高位,首先跳过连续的‘0’,然后跳过连续的‘1’,并数数有多少个1。如果这时还没到最高位,那就从刚才跳过的‘1’中拿出1个放到这位上(当前位是‘0’),然后把剩下的‘1’填到最低的几位上去。中间填充‘0’。比如:‘100111000’的下一个是‘101000011

代码:

// 5.3 Find the next largest number that have same number of '1's with the given number.
#include <cstdio>
using namespace std;

unsigned int findNext(unsigned int n)
{
int n_zero;
int n_one;

n_zero = 0;
while (n_zero < 32 && (n & (1 << n_zero)) == 0) {
++n_zero;
}
if (n_zero == 32) {
// all 0
return n;
}

n_one = n_zero;
while (n_one < 32 && (n & (1 << n_one)) != 0) {
++n_one;
}
if (n_one  == 32) {
// no larger number is possible
return n;
}

n = n >> n_one << n_one;
n |= (1 << n_one);
for (int i = 0; i < n_one - n_zero - 1; ++i) {
n |= (1 << i);
}

return n;
}

int main()
{
unsigned int n;

while (scanf("%u", &n) == 1) {
printf("%u\n", findNext(n));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐