C语言 用三种方法求一个整数二进制位中1的个数

目录

前言

一.第一种

二.第二种

三.第三种

总结


前言

   Hello!大家好,也是好久没写博客,感觉自己实在是有点懒,希望通过写博客的方式来加强自己的知识记忆和督促自己学习,好了,废话不多说,今天来讲一下C语言中用三种方法求一个整数二进制位中1的个数。

一.第一种

    根据十进制转二进制的原理,首先我们先让要判断一下我们要求的数除以2的余数是否等于1,如果等于1则我们就可以知道这个数的二进制数从右向左的第一位数是1,再让这个数除以2,相当于其二进制数减去一位,在从之前的判断操作,每次判断为1时,我们可以用一个变量记录下来,直到除二后的数字为0,这里上代码,代码后写了注释。

#include<stdio.h>
int two(unsigned a) //因为有正整数和负整数,所以这里就用无符号整形定义
{
	int count = 0;
	int b;
	while (a != 0)//循环除二直到为0为止
	{
		b = a % 2;
		if (b == 1)//如果余数为1,就说明该二进制位上的数为1
			count++;//用一个变量记录下来
		a /= 2;
	}
	return count;
}
int main()  //主函数
{
	int a;
	scanf("%d", &a);
	int n = two(a);
	printf("有%d个1", n);
}

二.第二种

    第二种方法用到了逻辑运算符和移位操作符,我们可以将要求的数按位与上一个1,判断得到地数是否为1,如果为1,则这位上是1,然后再用右移操作符移去一位,再按位与1,这里解释一下,((假设3按位与1)00000000000000000000000000000011

                                    00000000000000000000000000000001

会得到                         00000000000000000000000000000001

因为1的二进制数只有最后一位为1,它按位与上任何数除最后一位数之外都会变成0,从而可以判断这个数的最后一位是否为1。再用右移操作符移去一位继续判断,直到把32位都判断完)

重复之前的操作,因为一个整数的二进制最多为32位,所以重复32次就可以了,这里上代码。

#include<stdio.h>
int two(int a)//因为用了移位操作符不用考虑正负
{
	int i;
	int count = 0;定义一个变量记录
	for (i = 0; i < 32; i++)//循环32次
	{
		if (((a >> i) & 1) == 1)
			count++;
	}
	return count;
}
int main() //主函数
{
	int a;
	scanf("%d", &a);
	int n = two(a);
	printf("有%d个1", n);
}

三.第三种

    第三种方法和第二种方法有点像,这里直接解释不太好解释,直接上代码加上注释

#include<stdio.h>
int two(int a)
{
	int count = 0;
	while (a)//a为0时停止循环
	{
		a = a & (a - 1);//将a按位与上a-1,就相当于把二进制数上的最后一个为1的位上,把1变成0,再赋值给a,重复这个操作,直到把每一个为1的位都变成0。
		count++;
	}
	return count;
}
int main()
{
	int a;
	scanf("%d", &a);
	int n = two(a);
	printf("有%d个1", n);
}

总结

这就是C语言中用三种方法求一个整数二进制位中1的个数,如果有错误欢迎指出,如果有帮助,不要忘了点赞,蟹蟹。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-24 18:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-24 18:28:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-24 18:28:02       82 阅读
  4. Python语言-面向对象

    2024-01-24 18:28:02       91 阅读

热门阅读

  1. vue3的watchEffect和watch其他参数

    2024-01-24 18:28:02       54 阅读
  2. 一种计数算法

    2024-01-24 18:28:02       61 阅读
  3. 代码随想录二刷 |回溯 |分割回文串

    2024-01-24 18:28:02       62 阅读
  4. c# 抽象类

    2024-01-24 18:28:02       54 阅读
  5. 卸载 MariaDB:

    2024-01-24 18:28:02       46 阅读
  6. 几种Map和set的区别

    2024-01-24 18:28:02       54 阅读
  7. 2401llvm,clang的重构引擎

    2024-01-24 18:28:02       57 阅读
  8. 前端工程化之 webpack <一>

    2024-01-24 18:28:02       40 阅读