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;
}

程序运行结果:

利用函数如何求解二进制1的个数,不同位的个数,奇数和偶数位_二进制中奇数和偶数位

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;
}

程序运行结果:

利用函数如何求解二进制1的个数,不同位的个数,奇数和偶数位_二进制中不同位的个数_02


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;
}

程序运行结果:

利用函数如何求解二进制1的个数,不同位的个数,奇数和偶数位_二进制中1的个数_03