【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

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


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


目录
打赏
0
0
0
0
13
分享
相关文章
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
257 5
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
132 6
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
74 3
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
108 0
|
10月前
|
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
191 23
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
35 1
一文彻底搞清楚C语言的函数
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等