1.统计二进制中1的个数
设计1:我们可以分别对求解数的二进制位先%2后/2的方法统计1的个数
数字17 | %2 | /2 | ||
第一次 | 1 | 8 | ||
第二次 | 0 | 4 | ||
第三次 | 0 | 2 |
数字17 | %2 | /2 | ||
第一次 | 1 | 8 | ||
第二次 | 0 | 4 | ||
第三次 | 0 | 2 |
11转换为二进制:0000000000000000000000001011
数字11 | %2 | /2 | 0000000000000000000000001011 | 记数 |
第一次 | 1 | 5 | 0000000000000000000000000101 | +1 |
第二次 | 1 | 2 | 0000000000000000000000000010 | +1 |
第三次 | 0 | 1 | 0000000000000000000000000001 | +1 |
代码实现:
#include <stdio.h>
int count_bit_one( int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n = n / 2;
}
return count;
}
#include <stdio.h>
int main()
{
int a = 0;
printf("请输入正整数:\n");
scanf("%d", &a);
int count = count_bit_one(a);
printf("count=%d\n", count);
return 0;
}
但这里我们要注意:因为一个数在内存中的存储方式是二进制的补码,所以如果我们要用这种方法计算负数的话,会出现循环不能累加的问题。
解决方法:我们可以明确定义给定的整型变量是无符号型的
#include <stdio.h>
int count_bit_one(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n = n / 2;
}
return count;
}
int main()
{
unsigned int a = 0;
printf("请输入整数:\n");
scanf("%d", &a);
int count= count_bit_one(a);
printf("count=%d\n",count);
return 0;
}
设计2:我们可以通过把输入的整数依次分别向右移位再按位与1的方法统计1的个数
数字11 | >>i | &1 | 记数 |
i=0 | 0000000000000000000000001011 | 0000000000000000000000000001 | +1 |
i=1 | 0000000000000000000000000101 | 0000000000000000000000000001 | +1 |
i=2 | 0000000000000000000000000010 | 0000000000000000000000000001 | +0 |
i=3 | 0000000000000000000000000001 | 0000000000000000000000000001 | +1 |
代码实现:
int count_bit_one( int n)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((n >> i) & 1))
{
count++;
}
}
return count;
}
#include <stdio.h>
int main()
{
int a = 0;
printf("请输入整数:\n");
scanf("%d", &a);
int count = count_bit_one(a);
printf("count=%d\n", count);
return 0;
}
设计3:我们可以通过按位与的方法依次取得1的个数
代码实现:
int count_bit_one( int n)
{
int count = 0;
while (n)
{
n = n&(n - 1);
count++;
}
return count;
}
#include <stdio.h>
int main()
{
int a = 0;
printf("请输入整数:\n");
scanf("%d", &a);
int count= count_bit_one(a);
printf("count=%d\n",count);
return 0;
}
程序运行结果:
2.统计二进制中不同位的个数
设计构想:想要统计不同位的个数,第一步我们要给定两个整型变量,第二步利用异或的思想将两个数封装给一个中间变量,然后通过上述记数1的个数的方法进行统计
异或主要完成的功能:把两个数的二进制不相同的位的统计起来
代码实现1:
#include <stdio.h>
int count_bit_one(int n)
{
int count = 0;
while (n)
{
n = n&(n - 1);
count++;
}
return count;
}
int get_diff_bit(int m, int n)
{
int tmp = m^n;
return count_bit_one(tmp);
}
int main()
{
int m = 0;
int n = 0;
printf("请输入两个不同的整数:");
scanf("%d %d", &m, &n);
int count = get_diff_bit(m, n);
printf("count=%d\n", count);
return 0;
}
代码实现2:
#include <stdio.h>
int get_diff_bit(int m, int n)
{
int tmp = m^n;
int count = 0;
while (tmp)
{
tmp = tmp&(tmp - 1);
count++;
}
return count;
}
int main()
{
int m = 0;
int n = 0;
printf("请输入两个不同的整数:");
scanf("%d %d", &m, &n);
int count = get_diff_bit(m, n);
printf("count=%d\n", count);
return 0;
}
程序运行结果:
3.统计二进制的奇数位和偶数位
设计构想:还是利用依次进行右移和按位与的思想进行统计,在这里要注意的是设置循环时,奇数位最高为30,依次-2;偶数位最高为31,依次-2。
代码实现:
#include <stdio.h>
void print(int m)
{
int i = 0;
printf("奇数位:\n");
for (i = 30; i >= 0; i -= 2)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
printf("偶数位:\n");
for (i = 31; i >= 0; i -= 2)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
}
int main()
{
int m = 0;
printf("请输入一个整数:");
scanf("%d", &m);
print(m);
return 0;
}
程序运行结果: