【C语言】位运算

我们在上学计算机的第一节课,就应该见过这些常见的运算符。然而,你可能有印象,但记不住众多操作符当中的位运算符,以及它们的作用和使用场景,我们的大脑会选择性地遗忘它认为没用的信息,存储下那些“有实际应用场景”的有效知识。平时写代码的时候,只会和十进制打交道,这是因为在计算机的底层会帮我们把10进制运算的问题转化为二进制运算,计算机已经帮我们封装了位运算的逻辑。那么,我们为什么还要了解位运算呢?

在实际开发中,位图(Bitmap)是一种常用的数据结构和技术。通过高效的存储和操作方式,提供了快速且节省内存的解决方案。
例如,检测一批开发板是否合格,其中一个对象中存在某个属性:object:{ standard:true; } 这个对象中还有其他属性,但检测是否合格只需要判断 standard == 1;那么,假设用bit位来表示合格与不合格,1表示是,0表示非。
那么1个bit位 :10010000 第一个和第四个合格,其他的不合格,由此,我们不需要使用object的方式进行存储,我们可能将原本占用了32个字节大小的存储空间的对象压缩成了一个比特,8个比特可以检测8个开发板的合格与否。
一个字节是8个比特,所以存储空间被优化了256倍,假如有1000w块开发板需要检测并返回结果,用对象的方式存储需要占用的内存空间是300GB的内存空间大小,如果我们换成用bit的方式实现检测,只需要占用2GB的存储空间大小便能够完成检测。

使用这种一串比特位存储0和1两种状态的数据结构称为位图(BITMAP),
由此,我们知道了位图具有很多好处:

	节省内存:位图能节省巨量的存储空间。内存效率高:使用位来表示信息,节省存储空间。例如,一个字节可以表示8个布尔值。对比数组 + 对象的方式不仅性能高出一个数量级而且极大节约了内存空间。快速访问:通过位运算可以快速地检查、设置或清除特定位的值。例如,查询第一个位置是否为 真:x & (1<<n);即使是某些批量操作和复杂操作,也只需要一次就能完成。便捷方便。资源管理、高效存储:用于管理有限资源的使用情况,如内存页的分配。状态标记:在控制多个布尔状态时(如任务调度),使用位图可以高效地管理和检查状态。图形显示:在简单图形系统中,用位图表示图像的像素状态。权限控制:利用位图表示用户或进程的权限集合。

移位运算符:专门写软件的人而言不重要,但对于嵌入式开发来说,这很重要 —> 因为在寄存器开发中会经常遇到。

<<   >> 
格式:表达式 << n 
例子:移位运算--->针对位:bit位 --->二进制有关 int a=10;a<<3;
右移:要注意 符号位 算术右移: 空出来的位 补符号位 >考虑符号位逻辑右移: 空出来的位 补0  --->单纯的数值运算位运算: -->所有的运算都针对 二进制bit位 1>位与:& 解释: 表达式1 & 表达式2 ==>双方转化为二进制,按位对比,相同位上都为1,结果为1 例如: short a=520;short b=250;a&b--->a:0000 0010 0000 1000b:0000 0000 1111 1010   & ------------------------------>0000 0000 0000 1000 ==> 82>位或:|解释: 表达式1 | 表达式2 ==>相同位上数据如果有1,结果为1例如:short a=520;short b=250;a|b--->a:0000 0010 0000 1000b:0000 0000 1111 1010   |-------------------------------------  0000 0010 1111 1010  ==>7623>异或:^ 解释:表达式1 ^ 表达式2 ==>相同位上数据不相同,结果为1 例如:short a=520;short b=250;a^b--->a:0000 0010 0000 1000b:0000 0000 1111 1010     ^ -------------------------------0000 0010 1111 0010 ==> 754 4>取反:~ 解释: ~表达式1 ===> 0变1   1变0 例如: short a=520;a:0000 0010 0000 1000~a;1111 1101 1111 0111 --->有问题:补码1111 1101 1111 0110 --->反码 1000 0010 0000 1001 --->原码 = -521组合模仿:C语言原装是没有同或 :可以通过 取反 + 异或 得到同或  ~(a^b):  --->达到同或

在嵌入式系统中,因为寄存器内存是有限的,对于内存空间的使用更为苛刻,位运算具有性能优势:
1、速度:位运算是基本的CPU操作,直接作用于数据的二进制表示,计算速度极快,比许多其他操作(如乘法、除法)更高效。
2、内存效率:通过位操作,可以在一个字节中存储多个布尔值,节省内存空间。
3、直接硬件控制:位运算能够直接操作硬件寄存器,方便设置或读取特定位,减少指令开销。
4、代码简洁、精确控制:使用位掩码进行状态管理和权限控制,使代码更简洁明了。提供对数据的精确控制,适合底层开发。
5、功耗降低:由于减少了处理器的运算时间和内存访问,能有效降低功耗,这是嵌入式系统中一个重要的考量。

位运算在资源有限、需要高效运行的嵌入式系统中有显著的性能优势,并节省了大量的内存空间。
位运算在控制硬件设备、检查传感器状态、高效传输和存储等多个场景中都十分必要,所以要熟悉位运算的方式。正如在编程之前,首先对每个过程中的逻辑环节都必须十分清晰,不可模糊编程。也可在这个过程中锤炼自己的编程思维,对业务流程也会更加清晰。

以上。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

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

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

相关文章

C#各版本汇总

C#版本.NET版本发布日期C# 1.0.NET Framework 1.02002-2-13C# 1.1.NET Framework 1.12003-4-24C# 2.0.NET Framework 2.02005-11-7.NET Framework 3.02007-11-6C# 3.0.NET Framework 3.52007-11-19C# 4.0.NET Framework 4.02010-4-12C# 5.0.NET Framework 4.52012-8-15C# 6.0.N…

量化交易系统开发-实时行情自动化交易-3.4.1.2.A股交易数据

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于A股API获取交易数据。 …

2024-11-01 - 统一身份认证 - OpenLdap - 中间件 - 流雨声

摘要 2024-11-01 周五 杭州 暴雨 调查问卷: https://www.wjx.cn/vm/exIBFDM.aspx# 2024年转瞬即逝&#xff0c;可是生活还在继续&#xff0c;这里有一项关于人工智能和项目管理对于效能关系的调研问卷&#xff0c;AI 对工作的作用和影响。问卷不采集个人信息&#xff0c;在此…

【363】基于springboot的高校竞赛管理系统

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校竞赛管理系统信息管理难度大&#xff0c;容错率低&am…

Could not create task ‘:shared_preferences_android:generateDebugUnitTestConfig‘

flutter项目使用shared_preferences库的时候&#xff0c;打开flutter项目中的android项目运行&#xff0c;会出现如下错误信息&#xff1a; A build operation failed. Could not create task :shared_preferences_android:generateDebugUnitTestConfig. Could not create…

qt QTextFrame详解

1. 概述 QTextFrame是Qt框架中用于表示文本框架的类。它允许在QTextDocument中创建和管理具有特定边界和格式的文本区域。QTextFrame可以包含文本、图像、表格或其他QTextFrame&#xff0c;从而提供丰富的文本布局和排版功能。QTextFrame通常与QTextCursor结合使用&#xff0c…

【JWT】Asp.Net Core中JWT刷新Token解决方案

Asp.Net Core中JWT刷新Token解决方案 前言方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status === 401,说明我们的token已经过期了。方案二:实现用户无感知的刷新token值,我们希望当响应返回的数据是401身份过期时,响应阻拦器自动帮我…

linux,1.NFS和autofs,2.podman容器,3.http服务和虚拟web主机,4.内网DNS服务搭建

1.NFS和autofs 一.NFS服务器之间共享文件夹(服务端配置共享文件和权限,客户端进行挂载) 服务端1.安装包 nfs-utils2.服务器端,编写配置文件 /etc/exports/共享的文件路径 *(rw) 人(权限)允许所有客户端进行读写访问3.重启服务,并设置开机自启动客户端1.安装包 nfs-ut2.挂载mo…

如何在Microsoft Edge中删除已保存的网站密码

目录 前言1. 如何进入Edge的密码管理界面1.1 打开Microsoft Edge的设置菜单1.2 进入个人资料设置1.3 进入密码管理 2. 在Edge中查看和删除已保存的密码2.1 查找需要删除的密码2.2 检查密码安全性2.3 删除特定网站的密码 3. 提升Edge密码管理的安全性3.1 启用Edge的多重身份验证…

[ Linux 命令基础 4 ] Linux 命令详解-文本处理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Linux 实验:日志的备份与恢复 xfs文件系统

添加一个新的硬盘&#xff0c;创建硬盘分区sdc1 设置文件系统格式xfs&#xff0c;提示安装xfsprogs&#xff0c;如果安装失败&#xff0c;在后缀加上--fix-missing直到安装完成为止 mkdir创建空目录data&#xff0c;将sdc1挂载到data&#xff0c;data是根目录下新建的目录&…

Java中的I/O模型——BIO、NIO、AIO

1. BIO&#xff08;Blocking I/O&#xff09; 1. 1 BIO&#xff08;Blocking I/O&#xff09;模型概述 BIO&#xff0c;即“阻塞I/O”&#xff08;Blocking I/O&#xff09;&#xff0c;是一种同步阻塞的I/O模式。它的主要特点是&#xff0c;当程序发起I/O请求&#xff08;比如…

【C#】使用.net9在C#中向现有对象动态添加属性

在 C# 中向现有对象动态添加属性并不像在 Python 或 JavaScript 中那样容易&#xff0c;因为 C# 是一种强类型语言。 但是&#xff0c;我们可以通过使用一些技术和库来实现这一点&#xff0c;例如扩展方法、字典等。本文将详细介绍如何在 C# 中实现这一点。ExpandoObject 方法 …

Python学习从0到1 day26 第三阶段 Spark ⑤ 搜索引擎日志分析

目录 一、搜索引擎日志分析 二、需求1&#xff1a;热门搜索时间段(小时精度)Top3 实现步骤 三、需求2&#xff1a;打印输出:热门搜索词Top3 实现步骤 四、需求3&#xff1a;打印输出:统计hadoop关键字在哪个时段被搜索最多 实现步骤 五、需求4&#xff1a;将数据转换为JSON格式…

#渗透测试#SRC漏洞挖掘#深入挖掘CSRF漏洞01

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

NOIP2021比赛题解

报数 1.禁止报的数的生成规则与埃氏筛法类似&#xff0c;考虑用筛法预处理可以报出的数字列表和不可报出的数字&#xff0c;从而 O(1) 回答每一组询问。 具体来说&#xff0c;从 1 开始逐一处理每个正整数。当处理到数字 x 时&#xff0c;如果数字 x 尚未被标记为不合法&…

揭秘云计算 | 2、业务需求推动IT发展

揭秘云计算 | 1、云从哪里来&#xff1f;-CSDN博客https://blog.csdn.net/Ultipa/article/details/143430941?spm1001.2014.3001.5502 书接上文&#xff1a; 过去几十年间IT行业从大型主机过渡到客户端/服务器&#xff0c;再过渡到现如今的万物互联&#xff0c;IT可把控的资…

Grover算法——量子搜索算法

假设N个数据中符合条件的数据有M个&#xff0c;则量子搜索算法的复杂度为&#xff0c;远小于经典算法的复杂度。 黑箱 下面以N2为例&#xff0c;介绍黑箱如何标记符合条件的数据。N2意味着只有两个数据&#xff0c;可以用0和1来表示这两个数据&#xff0c;也就只需要一个量子比…

Ubuntu24.04网络异常与应对方案记录

PS: 参加过408改卷的ZJU ghsongzju.edu.cn 开启嘲讽: 你们知道408有多简单吗&#xff0c;操作系统真实水平自己知道就行&#xff5e;&#xff5e; Requested credits of master in UWSC30&#xff0c;in ZJU24&#xff0c;domestic master is too simple ubuntu安全软件 在 U…

智能的编织:C++中auto的编织艺术

在C的世界里&#xff0c;auto这个关键字就像是一个聪明的助手&#xff0c;它能够自动帮你识别变量的类型&#xff0c;让你的代码更加简洁和清晰。下面&#xff0c;我们就来聊聊auto这个关键字的前世今生&#xff0c;以及它在C11标准中的新用法。 auto的前世 在C11之前&#x…