《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数

简介:

本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第2章,第2.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 位运算构建特定二进制数

由前面可知,对寄存器特定位进行置1、清零或者取反,关键点在于要事先构建一个特别的数,这个数和原来的值进行位与、位或、位异或操作,即可达到我们对寄存器操作的要求。

自己去算这个数,显然既费时又费脑,虽然依托工具也可以算出来,但缺点就是不直观。如0X0003803A这个数谁能一下报出转换为二进制后为多少?太难了。既然如此,我们完全可以使用位运算(位与、位或、取反等等)快速地构建我们需要的操作数。

2.4.1 使用移位获取特定位为1的二进制数

最简单的就是用移位来获取一个特定位为1的二进制数。如我们需要一个bit3~bit7为1(隐含意思就是其他位全部为0)的二进制数。

我们可以用计算器或者直接用脑子去想。

这个数便是0b11111000 = 0xf8,而这个数并不容易一下就能想出来。

我们来利用二进制构造。

分析bit3~bit7为1,则该数是由5(7-3+1)个二进制的1构成的,只不过是从bit3开始连续排布的,所以我们就想构造一个从bit0开始连续排布的5个二进制1,左移3位即可实现。而这个数很容易就可以想出来,它就是0x1f,现在对这个数左移3位(0x1f << 3 )是不是就实现了呢。

也许,这个对比还不是很明显,我们再来看一个例子:获取bit3~bit7为1,同时bit23~bit25为1,其余位为0的数。

这个时候你用脑子去想是不是开始觉得头大了。

好了,你可以用笔或者计算器算下。这个数是0b0000 0011 1000 0000 0000 0000 1111 1000 = 0x038000f8。

我们来利用二进制构造。

bit3~bit7:以bit0为基准构造结果为0x1f。

bit23~bit25:以bit0为基准构造结果为0x07。

开始移位相或:(0x1f<<3) | (0x07<<23)

对比:假如要用C语言定义该数,如下所示。

int a = 0x038000f8; 
int a = (0x1f<<3) | (0x07<<23);

很显然,第二个可读性和可塑性提高了很多!

2.4.2 结合位取反获取特定位为0的二进制数

这次我们要获取bit4~bit10为0(该数总共32bit),其余位全部为1的数。有了上面的思维之后,想想该怎么做?我想如果你有了上面的思维后,相信聪明的你已经知道解法了吧。

分析:bit4~bit10为0,说明bit31~bit11都为1,bit3~bit0也都为1。
   bit31~bit11:以bit0为基准构造结果为0x1fffff。
   bit3~bit0:以bit0为基准构造结果为0x0f。

所以,结果是(0x1fffff<<11) | (0x0f<<0)。

但是,你有没有发现采用这种方法并没有什么太大的优势。连续为1的位数太多了,这个数字本身就很难构造,所以这种方法的优势损失掉了。这种特定位(比较少)为0而其余位(大部分)为1的数,不适合用很多个连续1左移的方式来构造,而适合左移加位取反的方式来构造。

思路:先试图构造出这个数的反码,再取反得到这个数。例如本例中要构造的数bit4~bit10为0,其余位为1,那我们就先构造一个bit4~bit10为1,其余位为0的数,然后对这个数按位取反即可。

· 构造该数的反码
bit4~bit10为0的数。其反码为bit4~bit10为1,其余bit为0,这个就很容易构造,就是0x7f<<4。

· 对其取反
对其构造的反码进行取反:~(0x7f<<4)。

对比:对该数用C语言定义,效果很明显。

int a = 0x1fffff<<11) | (0x0f<<0);
int a = ~(0x7f<<4);

2.4.3 总结

位与、位或结合特定二进制数,即可完成寄存器位操作需求。

如果你要的这个数中比较少位为1,大部分位为0,则可以通过连续很多个1左移n位得到。

如果你想要的数中比较少位为0,大部分位为1,则可以通过先构建其位反码,然后再位取反来得到。

如果你想要的数中连续1(连续0)的部分不止一个,那么可以通过多段分别构造,然后再彼此位或即可。这时候因为参与位或运算的各个数为1的位是不重复的,所以这时候的位或其实相当于几个数的叠加。

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
5月前
|
数据采集 监控 网络协议
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
553 40
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
|
4月前
|
运维 监控 网络协议
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
135 11
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
|
10月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
406 1
|
6月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
9月前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
462 76
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
549 9
|
7月前
|
云安全 人工智能 安全
阿里云网络安全体系解析:如何构建数字时代的"安全盾牌"
在数字经济时代,阿里云作为亚太地区最大的云服务提供商,构建了行业领先的网络安全体系。本文解析其网络安全架构的三大核心维度:基础架构安全、核心技术防护和安全管理体系。通过技术创新与体系化防御,阿里云为企业数字化转型提供坚实的安全屏障,确保数据安全与业务连续性。案例显示,某金融客户借助阿里云成功拦截3200万次攻击,降低运维成本40%,响应时间缩短至8分钟。未来,阿里云将继续推进自适应安全架构,助力企业提升核心竞争力。
|
8月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
310 11
|
10月前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
246 52

热门文章

最新文章

相关产品

  • 物联网平台