【C语言】求一个整数的二进制序列中1的个数的三种方法

简介: 【C语言】求一个整数的二进制序列中1的个数的三种方法

方法一:逐位%2法

该方法的初步测试代码如下:

int NumberOf1(int n) 
{
  int count = 0;
  while (n)
  {
        if (n % 2 == 1)
      {
       count++;
      }
          n = n / 2;
  }
  return count;
}

原理图解:

该方法图解如下:

测试运行:

原理图解如上,接下来运行测试一下:

测试正数:输入15

测试0:输入0

可以看到,程序测试非负数都是没有问题的,但是当测试到负数时就会这样:

测试负数:输入-6

可以看到,正数和0的测试都没有问题,但是负数却显示为0,我们来看看问题出在哪里了:

强制转换后函数代码如下:

int NumberOf1(unsigned int n) 
{
  int count = 0;
  while (n)
  {
        if (n % 2 == 1)
      {
       count++;
      }
          n = n / 2;
  }
  return count;
}

测试运行:

强制转换可以实现的原理是:


 方法二:逐位&1法

该方法的初步测试函数代码如下:

int NumberOf1(int n)
{
  int i = 0;
  int count = 0;
  for (i = 0; i <32; i++)
  {
    if (n >> i & 1 == 1)
    {
      count++;
    }
  }
  return count;
}

原理图解:

该方法原理图解如下:

测试运行:

测试正数:输入15

测试0:输入0

测试负数:输入-7

输出结果均正确,该方法可行。


方法三:n&(n-1)法

该方法的初步测试代码如下:

int NumberOf1(int n)
{
  int count = 0;
  while (n)
  {
    n=n& (n - 1);
    count++;
  }
  return count;
}

原理图解:

该方法原理图解如下:

测试运行:

原理如上,测试运行:

测试正数:输入11

测试0:输入0

测试负数:输入-11

输出结果均正确,该方法可行。


今日感悟:学而不思则罔,思而不学则殆!


相关文章
|
2天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
6天前
|
存储 编译器 C语言
C语言基础知识:数据在内存中的存储解析(整数,浮点数)
C语言基础知识:数据在内存中的存储解析(整数,浮点数)
|
7天前
|
C语言
C语言取整方法详解
C语言取整方法详解
11 0
|
15天前
|
C语言
多组数据的输入方法(c语言实现)
多组数据的输入方法(c语言实现)
|
27天前
|
C语言
【C语言】五种方法实现C语言中大小写字母的转化
【C语言】五种方法实现C语言中大小写字母的转化
|
6天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
2天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
2天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
4天前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0
|
4天前
|
C语言
【C语言】字符分类函数与字符转换函数
【C语言】字符分类函数与字符转换函数
9 1