一、使用while循环
int main()
{
int a = 0;
int count = 0;
printf("请输入一个数字:>");
scanf("%d", &a);
while (a)
{
if(a % 2 == 1)
count++;
a = a / 2;
}
printf("二进制中有%d个1\n",count);
return 0;
}
上面的方法无法计算负数的情况(但将int a = 0 改成 unsigned int a = 0 就可以成功 )
二、使用移位操作符和位操作符
13的二进制是00000000000000000000000000001101
1的二进制是00000000000000000000000000000001
需要将13的二进制位逐个向右移动,只要 按位与1 的结果是 1,那么就说明这一位是1
int main()
{
int a = 0;
int count = 0;
int i;
printf("请输入一个数字:>");
scanf("%d", &a);
for (i = 0; i < 32; i++)
{
if ((1& (a >> i))== 1)
count++;
}
printf("二进制中有%d个1\n",count);
return 0;
}
可以计算负数
三、运用n=n&(n-1)
int main()
{
int n = 0;
int count = 0;
int i;
printf("请输入一个数字:>");
scanf("%d", &n);
while (n)
{
n = n & (n - 1);
count++;
}
printf("二进制中有%d个1\n", count);
return 0;
}
这个表达式能将n的二进制中最右边的1去掉,最终n的值会变成0。
所以执行了多少次这个表达式,就说明有多少个二进制数1
四、判断一个数是否是2的n次方( 运用n=n&(n-1) )
因为2的n次方的数字的二进制都是最左边有一个1,其他的都是0.
1(十进制)------ 1 (二进制)
2(十进制)------- 10 (二进制)
4(十进制)------- 100 (二进制)
8(十进制)------- 1000 (二进制)
int main()
{
int n;
scanf("%d", &n);
if ((n & (n - 1)) == 0)// 只需一次值就成了0
printf("该数字是2的次方\n");
else
printf("该数字不是2的次方\n");
return 0;
}