计算二进制中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


目录
相关文章
|
3月前
二进制中1的个数
二进制中1的个数
18 0
|
1天前
|
存储 算法
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
7 0
|
13天前
|
C++
Acwing.26 二进制中1的个数
Acwing.26 二进制中1的个数
|
1月前
|
算法
算法题 — 整数转二进制,查找其中1的数量
算法题 — 整数转二进制,查找其中1的数量
12 0
|
4月前
统计两个整数所对应的二进制数中的不同位数的个数
统计两个整数所对应的二进制数中的不同位数的个数
20 0
|
9月前
求一个整数储存在内存中的二进制1的个数
求一个整数储存在内存中的二进制1的个数
求两个数二进制中不同位的个数
题目内容:两个int(32)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子: 7
|
算法
34.二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
63 0
34.二进制中1的个数
|
存储 机器学习/深度学习
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)
109 0
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)
|
存储 前端开发 程序员
二进制中1的个数(下)
二进制中1的个数(下)
二进制中1的个数(下)