实用指南:【C语言】统计二进制中1的个数:三种方法的比较与分析

news/2025/9/26 11:20:12/文章来源:https://www.cnblogs.com/yfceshi/p/19113128

引言

        在编程中,统计一个整数二进制表示中1的个数是一个常见且有趣的问题。本文将分析三种不同的实现方法,探讨它们的原理、优缺点以及适用场景。

目录

引言

问题描述

代码分析

方法一:除法和取模运算

方法二:位操作与循环移位

方法三:Brian Kernighan算法

性能比较

实际应用场景

扩展思考

结论


问题描述

        我们需要编写一个函数,计算给定整数的二进制表示中1的个数。例如,数字15的二进制是0000 1111,包含4个1。

代码分析

让我们详细分析提供的三种实现方法:

方法一:除法和取模运算

unsigned int a = 0;
int count1 = 0;
scanf("%d", &a);
while (a)
{
if (a % 2 == 1)
{
count1++;
}
a /= 2;
}
printf("count1=%d\n", count1);

原理

  • 通过不断除以2并取余数来获取二进制位;

  • 余数为1时计数增加。

优点

  • 思路直观,容易理解;

  • 不需要位操作知识。

缺点

  • 效率较低,需要多次除法和取模运算;

  • 修改了原始变量a的值;

  • 对于负数需要特殊处理(代码中使用unsigned int避免了这个问题)。

方法二:位操作与循环移位

int b = 0, count2 = 0;
scanf("%d", &b);
for (int i = 0; i > i)) == 1)
{
count2++;
}
}
printf("count2=%d\n", count2);

原理

  • 使用右移操作逐位检查;

  • 通过位与操作判断最低位是否为1。

优点

  • 使用位操作,效率较高;

  • 不修改原始变量b的值;

  • 明确处理32位整数,适用于所有情况。

缺点

  • 需要理解位操作;

  • 固定循环32次,即使数字很小。

方法三:Brian Kernighan算法

int c = 0, count3 = 0;
scanf("%d", &c);
while (c)
{
count3++;
c = c & (c - 1);
}
printf("count3=%d\n", count3);

原理

  • 利用c & (c - 1)可以清除最低位的1的特性;

  • 每次操作清除一个1,直到数字变为0。

优点

  • 效率最高,循环次数等于1的个数;

  • 代码简洁优雅;

  • 不依赖整数位数(适用于不同位宽的整数)。

缺点

  • 算法原理不太直观,需要理解位操作技巧。

性能比较

        为了更直观地比较三种方法的性能,我们考虑一个极端情况:数字0xFFFFFFFF(所有位都是1)。

  • 方法一:需要32次除法和取模运算;

  • 方法二:固定32次循环和位操作;

  • 方法三:只需要32次循环,但每次操作更简单。

在实际测试中,方法三通常是最快的,尤其是当数字中1的个数较少时。

实际应用场景

统计二进制中1的个数在多个领域有实际应用:

  1. 位图操作:在图形处理和图像压缩中,需要统计特定模式的位数;

  2. 密码学:计算汉明重量(Hamming weight),用于衡量密码强度;

  3. 错误检测:在通信系统中,统计奇偶校验位;

  4. 数据结构:在布隆过滤器和位集合中,需要统计设置的位数;

  5. 算法优化:在某些算法中,统计1的个数可以作为启发式信息。

扩展思考

  1. 处理负数:如果输入可能是负数,需要考虑使用无符号类型或采用补码表示法;

  2. 64位整数:对于64位整数,方法二需要循环64次,而方法三仍然是最优选择;

  3. 硬件支持:某些处理器架构(如x86的POPCNT指令)提供了直接计算1的个数的指令,性能更高;

  4. 查表法:可以预先计算0-255所有值的1的个数,然后通过查表快速计算,适合大量计算场景。

结论

本文分析了三种统计二进制中1的个数的方法:

  1. 除取模法:简单直观,适合初学者理解,但效率较低;

  2. 移位检测法:使用位操作,效率较高,但固定循环次数;

  3. Brian Kernighan算法:效率最高,代码简洁,是实际应用中的首选。

        在选择方法时,应该考虑代码的可读性、性能要求以及目标平台特性。对于大多数应用,Brian Kernighan算法是最佳选择,它结合了高效性和简洁性。

        理解这些方法不仅有助于解决具体问题,还能加深对二进制表示和位操作的理解,这是计算机科学的基础知识。希望本文能帮助你更好地掌握这些技巧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Prompt Builder-AI 提示词可视化工具 - 详解

Visual Prompt Builder-AI 提示词可视化工具 - 详解2025-09-26 11:18 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

STM32H743-ARM例程2-UART命令控制LED - 实践

STM32H743-ARM例程2-UART命令控制LED - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

大连做网站哪家便宜深圳市龙华区房价

作者:激越王预估稿费:400RMB投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿你是否听说过xml注入攻击呢,或者对它只知其一不知其二呢?现在让我们从xml相关基础知识开始,一步步了解xml攻…

建设科技处网站wordpress wap

目录 说明批量zip2pdf批量zip2pdf下载SS号重命名源代码SS号重命名源代码下载附录,水文年鉴 说明 1、zip2pdf是一个开源软件,支持自动化解压压缩包成PDG,PDG合成PDF,笔者在其基础上做了部分修改,支持批量转换。 2、秒…

提供做网站公司wordpress开启多站点

我们组件中 会有很多通用的信息和方法 那么 首先 我们看通用事件 通用事件中 最常用的就是我们的点击事件 比如说 我们之前常写的 组件.onClick(()>{//事件逻辑 })但是 我们之前 都没有用它接参数 我们可以这样 Button("跳转").onClick((ewat: ClickEvent)>…

网站建设html代码邢台信息港二手房出售

1.简介 双指针技巧是一种常见的算法解题方法,通过使用两个指针在数据结构上同时移动,可以解决多种问题。这种技巧通常适用于数组、字符串和链表等数据结构,下面我将详细介绍双指针技巧的特点和应用场景: 特点: 快慢…

完整教程:Zookeeper与Kafka:分布式系统中的协调与消息队列

完整教程:Zookeeper与Kafka:分布式系统中的协调与消息队列pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

vite-vue3 项目优化首屏加载速度

A嵌入B,B加载速度太慢了,需要4s+,需优化: B系统技术栈: vue3 + vite 优化结果如下,上下对比还有有差距的:一、先处理: 首屏加载的文件——先优化文件大 step1: 安装可视化插件 rollup-plugin-visualizer; vi…

深入解析:小九源码-springboot050-基于spring boot的苏蔚家校互联管理系统

深入解析:小九源码-springboot050-基于spring boot的苏蔚家校互联管理系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

建设自己公司的网站公司网站本地如何弄

目录 前言 一、Mybatis-Plus 开启日志的方式 二、测试 三、日志分析 章末 前言 小伙伴们大家好,相信大家平时在处理问题时都有各自的方式,最常用以及最好用的感觉还是断点调试,但是涉及到操作数据库的执行时,默认的话在控制台…

12_TCP和UDP实现服务端和客户端的通信

一、TCP实现多进程通信 server_process.c 服务端代码: #define _XOPEN_SOURCE #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h…

各种软件的官方文档和安装包下载地址记录

各种软件的官方文档和安装包下载地址记录组件 官网文档 官方下载地址Elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/index.html https://www.elastic.co/downloads/past-releases?product=…

基于导频的OFDM系统的信道估计(使用LS估计算法)

在OFDM系统中,信道估计是关键的一步,因为它直接影响到信号的解调和系统性能。最小二乘(LS)估计算法是一种常用的信道估计方法,它通过已知的导频符号来估计信道响应。 基于MATLAB的OFDM系统信道估计的实现,使用LS…

Day22super详解

super是一个关键字,用于子类访问父类的属性方法与构造器,与this一样在调用构造器的时候两者由于java语法的强制要求,都需要放在第一行,所以当用this取调用子类的构造器是,无法在用super去调用父类的构造器,否则会…

台州网站搜索排名巴中建设网站

千视携NDI 6技术闪耀2024 CCBN展会&#xff0c;呈现轻量化媒体解决方案 2024年4月24日至26日&#xff0c;北京首钢会展中心将举办第三十届中国国际广播电视网络技术展览会&#xff08;CCBN2024&#xff09;。这是中国广播电视行业的一项重要盛会&#xff0c;将有国内外超600家…

九讯鹿网站建设导购个人网站怎么做的

1、UML-4+1视图 UML-4+1视图将会与后面的架构4+1视图会一一对应上 视图往往出现在什么场景:我们看待一个事物,我们觉得它很复杂,难以搞清楚,为了化繁为简,我们会从一个侧面去看,这就是视图。而4+1视图就是分不同角度去看事物。 逻辑视图(logical view) 一般使用类与对…

外发图纸如何控制的最佳实践与注意事项

在工程项目中,外发图纸的管理非常重要。为了保证图纸的准确性和安全性,各个环节都需要有效控制。首先,标准化流程是基础,确保图纸的生成和审核符合要求。此外,使用像Ftrans B2B企业间文件安全交换系统这样的工具,…

Gitee:中国开发者生态的数字底座正在重构技术格局

Gitee:中国开发者生态的"数字底座"正在重构技术格局 在全球数字化转型加速推进的当下,中国开发者生态正在经历一场深刻的变革。作为本土领先的代码托管平台,Gitee凭借其独特的本土化优势和创新服务模式,…

快递100

[ { "label":"中通快递", "value":"zhongtong", "type":"国内运输商" }, { "label":"圆通速递&q…

文件同步软件是什么?主要有哪几种类型?

文件同步软件在现代企业中扮演着关键角色,帮助保障数据一致性和提高协作效率。它的运用不仅能确保团队成员在不同设备间实时共享文件,还能简化数据管理流程。以Ftrans FTC文件传输管控系统为例,这种软件支持多种文件…