一,统计二进制中1的个数
内容:写一个函数返回参数二进制中1的个数。
(比如:15 <0000 1111> 4个1)
1.得到二进制的每一位,使用该二进制%2 /2
#include <stdio.h>
//统计二进制中1的个数
int count_num_of1(unsigned int n)//放无符号数的参数,就可以计算负数
{
int count = 0;
while (n)//n只要不为0,其二进制数里一定有1
{
if ((n % 2) == 1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int n = count_num_of1(num);
printf("%d个1\n", n);
return 0;
}
2.n(一个二进制数)&(按位与)1就能得到该二进制里的最低位是几
(&:同真为真,一假全假)
#include <stdio.h>
int count_num_of1(int n)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
count++;
}
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int n = count_num_of1(num);
printf("%d个1\n", n);
return 0;
}
3.
#include <stdio.h>
int count_num_of1(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int n = count_num_of1(num);
printf("%d个1\n", n);
return 0;
}
PS:n&(n-1)还可以用来判断一个数是不是2的n次方
//2^1--->10(二进制)
//2^2--->100
//2^3--->1000
//……
if ( n & ( n-1 ) == 0)
{
printf("%d\n",是2的n次方);
}
//此方法就可以判断了
二,求两个数二进制中不同位的个数
内容:
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
输入例子:1999 2299
输出例子:7
1.
#include <stdio.h>
//求两个数二进制中不同位的个数
int count_diff_bit(int m,int n)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (((m >> i) & 1) != ((n >> i) & 1))
{
count++;
}
}
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int ret = count_diff_bit(m, n);
printf("%d\n", ret);
return 0;
}
2. ^(异或操作符),相同为0,相异为1
#include <stdio.h>
int count_diff_bit(int m, int n)
{
int count = 0;
int ret = m ^ n;
//统计一下ret中二进制有几个1
while (ret)
{
ret = ret & (ret - 1);
count++;
}
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int ret = count_diff_bit(m, n);
printf("%d\n", ret);
return 0;
}