《嵌入式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的位是不重复的,所以这时候的位或其实相当于几个数的叠加。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
8天前
|
存储 物联网 调度
操作系统的心脏:内核深度解析
在数字世界的构建中,操作系统扮演着基石的角色,而其核心—内核,则是这一复杂系统的灵魂。本文将深入探讨操作系统内核的工作原理,揭示它是如何管理硬件资源、运行程序以及提供系统服务的。通过理解内核的结构和功能,我们可以更好地把握计算机系统的运作机制,进而优化和创新我们的技术实践。
|
26天前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
17天前
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
2天前
|
存储 人工智能 安全
操作系统的心脏——内核深度解析
【10月更文挑战第29天】 本文深入探讨了操作系统的核心组件——内核,包括其定义、功能、架构以及在现代计算中的重要性。通过对比不同操作系统内核的设计哲学和技术实现,揭示了内核如何影响系统性能、稳定性和安全性。此外,文章还讨论了未来内核技术的潜在发展方向,为读者提供了一个全面了解内核工作原理的平台。
|
6天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
31 4
|
7天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
17天前
|
监控 安全 Java
构建高效后端服务:微服务架构深度解析与最佳实践###
【10月更文挑战第19天】 在数字化转型加速的今天,企业对后端服务的响应速度、可扩展性和灵活性提出了更高要求。本文探讨了微服务架构作为解决方案,通过分析传统单体架构面临的挑战,深入剖析微服务的核心优势、关键组件及设计原则。我们将从实际案例入手,揭示成功实施微服务的策略与常见陷阱,为开发者和企业提供可操作的指导建议。本文目的是帮助读者理解如何利用微服务架构提升后端服务的整体效能,实现业务快速迭代与创新。 ###
48 2
|
25天前
|
前端开发 开发者 容器
构建响应式Web界面:Flexbox与Grid布局的深度解析
【10月更文挑战第11天】本文深入解析了CSS3中的Flexbox和Grid布局,探讨了它们的特点、应用场景及使用方法。Flexbox适用于一维布局,如导航栏;Grid布局则适用于二维布局,如复杂网格。通过示例代码和核心属性介绍,帮助开发者灵活构建响应式Web界面。
47 5
|
27天前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
41 1
|
1月前
|
开发框架 缓存 前端开发
electron-builder 解析:你了解其背后的构建原理吗?
本文首发于微信公众号“前端徐徐”,详细解析了 electron-builder 的工作原理。electron-builder 是一个专为整合前端项目与 Electron 应用的打包工具,负责管理依赖、生成配置文件及多平台构建。文章介绍了前端项目的构建流程、配置信息收集、依赖处理、asar 打包、附加资源准备、Electron 打包、代码签名、资源压缩、卸载程序生成、安装程序生成及最终安装包输出等环节。通过剖析 electron-builder 的原理,帮助开发者更好地理解和掌握跨端桌面应用的构建流程。
63 2

热门文章

最新文章

相关产品

  • 物联网平台
  • 下一篇
    无影云桌面