您的位置:首页 > 其它

10--输入一个十进制的整数,转化为二进制,输出有多少个1

2015-09-27 19:01 399 查看
/*
问题描述:
输入一个十进制的整数,转化为二进制,输出有多少个1.

解题思路:
(1):位操作,然后移动光标。不是移动输入数字,而是移动flag。
因为负数第一个为1,向右移动为了保证负数,所以填充为1,
出现无限循环的可能。

(2):第二种效率更高,二进制出现多少个1,就循环多少次。
while (n)
{
number++;
n = (n - 1) & n;
}

相关问题:
(1)
一条语句判断是不是2的整数次方。
那就是判断是否只有一个1!
if (n != 0 && (0 == (n - 1) & n))    printf("是2的整数次。\n")

(2)
把一个整数减去1之后,再和原来的整数相与,得到新的数,相当于把原来的数字,最右面的1换成0。
printf("%d", x&(x-1));

*/

#include <stdio.h>

int countOneInNum1(int x)
{
int number = 0;
int i = 0;
unsigned int flag = 1;        //无符号整型
while (flag)
{
i++;
if (x & flag)
number++;
flag = flag << 1;        //左移动flag
}

//循环了32次 int占4个字节, 4 * 8 = 32
printf("循环了-- %d -- 次\n", i);
return number;
}

int countOneInNum2(int n)
{
int number = 0;
while (n)
{
number++;
n = (n - 1) & n;
}

return number;
}

int main()
{
int x;
scanf("%d", &x);

printf("%d\n", countOneInNum1(x));
printf("%d\n", countOneInNum2(x));

//把一个整数减去1之后,再和原来的整数相与,得到新的数,
//相当于把原来的数字,最右面的1换成0。
printf("%d\n", x&(x-1));

if (x != 0 && (0 == ((x - 1) & x)))
printf("%d是2的整数次。\n", x);

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