写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
程序原型:
int count_one_bits(unsigned int value)
{
// 返回 1的位数
}
写一个函数返回参数二进制中 1 的个数
比如: 15 的二进制表示为 0000 1111 4 个 1
程序原型:
int count_one_bits(unsigned int value)
{
// 返回 1的位数
}
&:按位与
位操作中的与操作运算符。
也就是常说的and操作,双目运算符。
计算的时候按位计算,&两边操作数对应位上全为1时,结果的该位值为1。否则该位值为0
比如 15 0000 1111 4个1 (我省略了前面24个0一共有32位 下面也是)
判断二进制上每一位的值:
先判断二进制第一位的值------
15 0000 1111
&
1 0000 0001
结果 0000 0001
再判断第二位------>
右移
左边补0
15左移 0000 0111
所以 (value>>i)&1==1 num++
代码如下
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int value)
{
int i;
int num=0;
int c = 1;
for (i = 0; i < 32; i++)//整形4个字节 32位
{
if ((value >> i) & 1 == 1)
{`
num++;
}
}
return num;
// 返回 1的位
}
int main()
{
printf("输入一个你你想要判断的数让程序来判断它在二进制中1的个数\n");
int value,num;
scanf("%d", &value);
num = count_one_bits(value);
printf("这个数在二进制中1的个数为%d\n", num);
system("pause");
return 0;
}
还可以直接移位
代码如下
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int value)
{
int i;
int num=0;
// 00000000 00000000 00000000 00000001
// 一直左移动 右边补 0
// 32次之后
// 00000000 00000000 00000000 00000000 这就是判断循环结束的条件 等于0的时候
for (i = 1; i != 0;i<<=1 )
{
if ((value&1)==1)
{
num++;
}
value >>=1;
}
return num;
// 返回 1的位数
}
int main()
{
printf("输入一个你你想要判断的数让程序来判断它在二进制中1的个数\n");
int value,num;
scanf("%d", &value);
num = count_one_bits(value);
printf("这个数在二进制中1的个数为%d\n", num);
system("pause");
return 0;
}
第三种方法
#include<stdio.h>
#include<stdlib.h>
int main(){
printf("请输入你想要输入的两个值(用空格隔开)\n");
int m, n, i, num=0;
scanf("%d %d", &m, &n);
for (i = 0; i < 32; i++)
{
if (((m >> i) & 1) != ((n >> i) & 1))
{
num++;
}
}
printf("整数m和n的二进制表达中有%d个不同", num);
system("pause");
return 0;
}