C语言/计算整数二进制位中的1的个数

简介: C语言/计算整数二进制位中的1的个数

提示:在32位机器下,一个整数的二进制是32位;在64位机器下,一个整数的二进制是64位.本文统一采用32位机器计数方法。

文章目录

  • 前言
  • 一、关于一个整数的二进制表示方法
  • 二、计算二进制中的1的方法
  • 1.取余法
  • 2.移位法
  • 3.高级计算法

前言

在计算机中存储数据/信息/代码,是以二进制方式存储,所以我们为了更加了解计算机的运行方式,需要去了解一下关于计算二进制位中的1和0的个数的方法。

本文是关于C语言中计算整数二进制位中的1的个数的三个方法。


一、关于一个整数的二进制表示方法

整数包括:正整数、负整数、零。

在二进制表示中,正整数和零的原码,反码,补码是一致的;负整数的原码,反码,补码表示方法各不一样。
负整数的原码:将最高位取1,其他位按二进制方法取0和1;

             反码:将原码的符号位(最高位)不变,其他位按位取反(原本是1的取0,原本是0的取1);

             补码:在反码的基础上,进行加1,即可得到补码。

二、计算二进制中的1的方法

1.取余法

注意:本方法只能争对非负整数
将一个非负整数进行转变为计算机中存储的二进制,本质上就是对该非负整数,不断地对2整除和取余.

例:将10的二进制中的1的个数求出:

代码:

#include<stdio.h>
int main()
{
  int a = 10;
  int count = 0;//二进制1的个数存储
  while (a)
  {
    //二进制里最后面那个数是1
    if (a % 2 != 0)
    {
      count++;
    }
    a /= 2;
  }
  printf("%d\n", count);
  return 0;
}

输出:

2

结果分析:        

10的二进制原码:         00000000000000000000000000001010

其中1的个数为2。

2.移位法

在C语言中,右移运算符(按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1)可以帮助我们完成计算二进制中的1的个数。

方法:先将一个整数进行与1按位与(&),判断结果为1还是0,如果是1则该二进制中1的个数加1,再右移1位;再将其进行按位与1,判断结果为1还是0,右移1位……直到该整数等于0或者已经循环判断32次。

例:将-1的二进制中的1的个数求出:

代码:

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

输出:

32

结果分析:

-1在计算机中的存储方式为反码,它的反码是:11111111111111111111111111111111

其中1的个数为32。

3.高级计算法

例:将11的二进制中的1的个数求出:

代码:

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

输出结果:

3

结果分析:

11的二进制原码:00000000000000000000000000001011

其中1的个数为3


总结

以上就是今天的内容,本文仅仅简单介绍了 的三种方法,而第三种方法能使我们快速便捷地处理数据的二进制中的1的个数。

这篇博客如果对你有帮助,给博主一个免费的点赞以示鼓励,欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!

如果有什么疑问或不同的见解,欢迎评论区留言哦。

相关文章
|
2月前
|
存储 算法 安全
C 语言中的位运算:挖掘底层计算的高效力量
位运算是C语言中直接操作二进制位的一种技术,能高效处理底层数据,广泛应用于优化算法、硬件编程等领域,是掌握C语言高级特性的关键之一。
|
2月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
93 5
|
3月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
181 4
|
8月前
|
存储 C语言
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
|
8月前
|
C语言
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言刷题系列】交换整数的奇数位和偶数位
|
8月前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
|
8月前
|
C语言
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
|
JavaScript 算法 前端开发
《C语言程序设计》一3.4 案例学习——计算一年中某月份的总天数
本节书摘来自华章出版社《C语言程序设计》一 书中的第3章,第3.4节,作者:赵宏 陈旭东 马迪芳,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1700 0
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
62 23
|
1月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
66 15

热门文章

最新文章