求二进制位中一的个数

简介: 求二进制位中一的个数

题目内容:

写一个函数返回参数二进制中 1 的个数,负数使用补码表示。

比如: 15    0000 1111    4 个 1

方法一:

#include<stdio.h>
int NumberOf1(unsigned int n)
{
  int count = 0;
  while (n)
  {
    if (n % 2 == 1)
      count++;
    n /= 2;
  }
  return count;
}
int main()
{
  int n;
  scanf("%d", &n);
  int num = NumberOf1(n);
  printf("%d\n", num);
}


NumberOf1函数的实现比较简单,它使用了一个循环,不断将n除以2,并判断余数是否为1。如果余数为1,则说明n的二进制表示中最低位为1,计数器count加1。然后,将n右移1位,继续进行下一轮循环,直到n的二进制表示中所有位都被访问过。最终,函数返回1的个数。


在main函数中,它调用了NumberOf1函数,读入一个整数n,并将它作为参数传递给NumberOf1函数。函数返回的结果被赋值给变量num,并通过printf函数将结果输出到控制台上。


方法二:

#include<stdio.h>
int NumberOf1(int n)
{
  int i = 0, count = 0;
  for (i = 0; i < 32; i++)
  {
    if ((n >> i) & 1 == 1)
      count++;
  }
  return count;
}
int main()
{
  int n;
  scanf("%d", &n);
  int num = NumberOf1(n);
  printf("%d\n", num);
}

NumberOf1函数的实现比较简单,它使用了一个for循环,对于n的二进制表示中的每一位进行检查。首先,将n右移i位,然后使用按位与运算符( &)判断n的第i位是否为1。如果为1,计数器count加1。最后,循环执行完毕后,函数返回统计到的1的个数。


需要注意的是,在统计有符号整数的二进制表示中1的个数时,应该考虑符号位的影响。如果使用带符号位的右移运算符(>>),则符号位将被保留。因此,可以使用无符号位的右移运算符(>>)来消除符号位的影响。此外,在使用按位运算符( &)判断某一位是否为1时,也需要小心处理。


方法三:

#include<stdio.h>
int NumberOf1(int n)
{
  int count = 0;
  while (n)
  {
    n = n & (n - 1);
    count++;
  }
  return count;
}
int main()
{
  int n;
  scanf("%d", &n);
  int num = NumberOf1(n);
  printf("%d\n", num);
}


NumberOf1函数的实现比较巧妙,它使用了一个while循环和一种称为“Brian Kernighan算法”的技巧。循环中,不断对n与(n-1)进行按位与运算,这将会把n中最右边的1变为0。每次操作之后,计数器count加1,然后继续进行下一轮循环,重复这个过程,直到n为0。最终,函数返回1的个数。


使用Brian Kernighan算法来统计一个整数的二进制表示中1的个数的时间复杂度为O(log n),比其他方法都要更加高效,因为它跳过了很多不必要的计算。该算法在处理大型数据集时效率尤其显著。

目录
相关文章
|
9月前
|
算法 测试技术 C#
C++数位算法:数字1的个数
C++数位算法:数字1的个数
|
2月前
|
算法 Python
计算32位二进制整数中1的个数(包括负数补码)
计算32位二进制整数中1的个数(包括负数补码)
52 0
|
7月前
统计两个整数所对应的二进制数中的不同位数的个数
统计两个整数所对应的二进制数中的不同位数的个数
27 0
一个数字的二进制数字里的一的个数(负数用补码)
这是一种解决问题的函数,缺点,会有死循环,((int)pow(-2, i))这个值的结果是整形永远达不到那个数字2147483648,我们必须自己规定那个数字
39 0
求两个数二进制中不同位的个数
题目内容:两个int(32)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子: 7
输出最小的数位和等于x并且各个数位都不一样的值
输出最小的数位和等于x并且各个数位都不一样的值
38 0
位运算:二进制中1的个数
题目: 输入一个 32 位整数,输出该数二进制表示中 1 的个数 注意: 负数在计算机中用其绝对值的补码来表示。 数据范围: −100≤ 输入整数 ≤100 样例1: 输入:9 输出:2 解释:9的二进制表示是1001,一共有2个1。 样例2: 输入:-2 输出:31 解释:-2在计算机里会被表示成11111111111111111111111111111110, 一共有31个1。
77 0
【13. 二进制中1的个数、位运算】
## 位运算 >n 的 二进制表示中第K位是几 > >n = 15 = (1111)<sub>2</sub> >1. 先把第K位移动到最后一位 n >> k >2. 看个位是几 x & 1 > >(1)和(2)操作合并 `n >> k & 1`
91 0
【13. 二进制中1的个数、位运算】