计算二进制中1的个数

简介: 计算二进制中1的个数

计算二进制中1的个数


众所周知,


二进制是由1和0组成。
十进制是由0到9的是个数字组成。


计算十进制的某个数的个数,相比大家一眼就能看出,

但如何用计算机逻辑去计算呢?

接下来就和大家一起来探讨

给定一个十进制数 1234


eca372b6b7cfb2967a9e784e8ce435df_6df774837a0746e3aeb344715d1f45ab.png


通过%10得到最后一位,然后/10将最后一位去掉。
反复操作,直到/10的结果为0。
经过此操作便可获得十进制中的每个数


由此是不是可以联想到,获得二进制的每个数也是如此呢?

答案当然是如此


5dfb4fa5afb75630a63e9370af9e27dd_e4bd3db2f7ca43f88eaf0cbb9e5cba74.png


下面就用代码进行实现


#include<stdio.h>
int main()
{
  int i = 0;
  int count = 0;//用于统计1的个数
  scanf("%d", &i);
  while (i)
  {
  if (i % 2 == 1)
  {
    count++;
  }
  i /= 2;
  }
  printf("%d\n", count);
  return 0;
}


0f5cb8451bbb3a7d265b658414933a80_046a67cf323a4868abd6e8cbf3889eb1.png


-1的二进制为
11111111111111111111111111111111
当输入的数值为负数,此方法就失效啦

d968c34d221cabe8ccf2a38af352727b_ea2377744c154629a52a515d6197dc35.png


会不会有别的方法可以更加准确地计算二进制中1的个数?


因为操作符中的按位与,按位或和按位异或可对二进制位进行操作,所有这些操作符是不是可以用来计算二进制中一个个数呢?


按位与操作符,在二进制中相同位置,两数相同为1,否则为0


由此可以想到,如果1去按位与这个数;


如果,这个数二进制中最后一位是1,则结果为1
否则,结果为零。


然后再通过右移操作符每次移动一位,就可计算这个数的二进制中1的个数


代码实现如下


#include<stdio.h>
int main()
{
  int num = 0;
  scanf("%d", &num);
  int count = 0;//用于统计二进制中1的个数
  int i = 0;
  for (i = 0; i < 32; i++)
  {
  if ((num >> i) & 1 == 1)
  {
    count++;
  }
  }
  printf("%d\n", count);
  return 0;
}


就算输入的是负值,结果也是正确的,所以此方法是正确的


427e613074f39f87e74212eaeee92015_fe94404721a643bc97a3cbfffc8cf6d1.png


到这里会发现一个问题,此方法虽然正确,但是太过繁琐。

就算是数字0也要循环32次

因此应该想着如何去完善这个代码


b843101547504671dfe3c706eebeab54_1e4b55b9ed9d4ccc9f534a41418fe203.png


通过上面的操作,先确定一个数n,然后计算n-1;
再将两者按位与n&(n-1),   然后将其赋值给n,n=n&(n-1);
重复操作,直到n=0。**循环的次数**便是二进制中1的个数。

代码如下


#include<stdio.h>
int main()
{
  int num = 0;
  scanf("%d", &num);
  int count = 0;//用于统计二进制1的个数
  while (num)
  {
  num = num & (num - 1);
  count++;
  }
  printf("%d\n", count);
  return 0;
}

d773d5fe482a7a46dde055c44fb38951_f0204bdf3bdb4d55b56d6fe208858a4f.png


目录
相关文章
|
JavaScript
JS封装节流函数
JS封装节流函数
214 0
|
数据采集 机器学习/深度学习 算法
【优秀设计案例】基于K-Means聚类算法的球员数据聚类分析设计与实现
本文通过K-Means聚类算法对NBA球员数据进行聚类分析,旨在揭示球员间的相似性和差异性,为球队管理、战术决策和球员评估提供数据支持,并通过特征工程和结果可视化深入理解球员表现和潜力。
642 1
【优秀设计案例】基于K-Means聚类算法的球员数据聚类分析设计与实现
Discuz 手机版访问自动跳转到手机域名
Discuz 手机版访问自动跳转到手机域名
328 1
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的参数文件
MySQL启动时会读取配置文件my.cnf来确定数据库文件位置及初始化参数。该文件分为Server和Client两部分,包含动态与静态参数。动态参数可在运行中通过命令修改,而静态参数需修改my.cnf并重启服务生效。文中还提供了相关代码示例和视频教程。
287 6
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
Kubernetes 前端开发 Dubbo
Spring Boot+gRPC构建微服务并部署到Istio(详细教程)
Spring Boot+gRPC构建微服务并部署到Istio(详细教程)
小功能⭐️Unity 如何判断物体是否在摄像机视野内或外
小功能⭐️Unity 如何判断物体是否在摄像机视野内或外
|
SQL 监控 数据可视化
Google Analytics
【6月更文挑战第8天】Google Analytics
551 4
|
存储 人工智能 数据可视化
阿里云服务器的十二种典型应用场景
阿里云还提供了数据可视化服务DataV,帮助用户通过图形化的界面轻松搭建专业水准的可视化应用。用户可以利用DataV进行数据监控、调度和会展演示等工作,提高数据分析和决策的效率。
|
Linux 计算机视觉 Python
在Linux系统上安装OpenCV
在Linux系统上安装OpenCV
1552 0