《嵌入式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
相关文章
|
22天前
|
安全 数据挖掘 Linux
Linux命令rpm深度解析
`rpm`是Linux下的软件包管理器,用于安装、升级、卸载和查询`.rpm`包,常见于Red Hat系Linux。它管理依赖、维护软件信息数据库,支持版本控制和安全验证。常用命令如`-i`安装,`-U`升级,`-e`卸载,`-q`查询。安装时用`-v`和`-h`可查看详细信息和进度。注意依赖关系、权限和签名验证,最佳实践包括使用仓库、定期更新和备份数据。
|
17天前
|
安全 Linux 应用服务中间件
Linux命令show-installed的深入解析
`show-installed`是Linux中一个假设的命令,模拟显示已安装软件包的功能。它结合了`apt`、`yum`等包管理器的特性,提供跨发行版的兼容性,展示包的名称、版本、安装时间和来源。可用参数如`-n`过滤名称,`-v`显示版本,`-s`显示来源,`-t`显示时间。注意需root权限运行,大系统中可能影响性能。最佳实践包括定期审查、使用过滤、结合其他命令和备份数据。
|
3天前
|
Linux
《解析 Linux 命令:systemd-delta》
`systemd-delta`: 解析Linux服务配置差异。概览: 显示服务单元文件与默认配置的对比,助于配置问题排查与系统审计。特点: 清晰展示修改点,涵盖启动选项等。示例: `systemd-delta [--plain] &lt;service&gt;`. 注意: 理解默认配置,谨慎修改,定期检查。掌握此命令,深化系统服务配置洞察,优化Linux管理。#Linux #systemd-delta
|
12天前
|
存储 监控 Linux
stdbuf命令在Linux中的深度解析
`stdbuf`是Linux工具,用于控制命令的stdin、stdout和stderr的缓冲模式。它可以设置为无缓冲、行缓冲或块缓冲,以优化数据处理和实时性。例如,`stdbuf -o0 cmd`禁用cmd的输出缓冲,`-oL`则按行缓冲。在需要实时监控或高效处理大量数据时,选择合适的缓冲模式至关重要。注意,过度使用无缓冲可能影响性能,并非所有系统都支持`stdbuf`。
|
12天前
|
监控 安全 Linux
Linux命令ssltap的深入解析与应用实践
`ssltap`是一个假想的Linux命令,用于模拟SSL/TLS流量分析。它捕获、解密(如果有密钥)并分析加密流量,提供实时监控、协议解析和安全审计。特点包括实时性、灵活性、可扩展性和安全性。示例用法包括捕获特定端口流量和实时监控会话状态。在实际操作中应注意私钥安全、性能影响及合规性,建议定期审计和自动化监控。
|
16天前
|
安全 算法 Linux
Linux命令signver的深入解析
`signver`非Linux标准命令,常用于APK签名版本指定,确保安全性和市场兼容性。在加固工具配置中,如`NHPProtect.jar`,它可能作为参数 `-signver` 使用,允许指定(v1, v2, v3)等签名版本。正确配置保证通过验证,增强用户数据安全。注意兼容性、正确填写配置并定期更新加固工具。测试和遵循最佳安全实践同样关键。
|
15天前
|
Linux
查看linux内核版本
在Linux中查看内核版本可使用`uname -r`、`cat /proc/version`、`lsb_release -a`、`cat /etc/*release`、`dmesg | grep Linux`、`hostnamectl`、`kernrelease`(部分系统)、`rpm -q kernel`(RPM系统)或`dpkg -l linux-image-*`(Debian系)。
14 2
|
16天前
|
Unix Linux C++
Linux命令size的深入解析
`size`命令在Linux中用于查看目标文件的内存布局,显示代码、数据和BSS段的大小,助力程序优化和资源管理。支持多种输出格式、基数和与其他命令结合使用进行递归分析。常用参数包括设置格式(-A)、基数(-m)、人类可读(-h)和总计(-t)。通过示例展示了如何查看单个或多个文件的大小,并与`find`结合遍历目录。使用时注意文件访问权限和选择合适的输出选项。
|
18天前
|
存储 数据管理 Linux
Linux命令sg的深入解析与应用
**Linux的`sg`命令用于高效管理SCSI设备,它基于DMA和Scatter-Gather技术,提供直接设备控制和高效数据传输。`sg`常通过`sg3_utils`工具集来使用,例如`sg_io`,用于执行SCSI命令。在实际应用中,需注意权限、数据安全和兼容性问题,遵循备份、详细阅读文档和逐步测试的最佳实践。**
|
18天前
|
存储 安全 算法
Linux命令sha1sum的详细解析
`sha1sum`是Linux下的命令行工具,用于计算文件的SHA-1哈希值,用于验证文件完整性和安全性。SHA-1算法将数据转化为160位的哈希值,具有唯一性、固定长度和单向性。命令支持二进制或文本模式,可检查校验文件、保存哈希值、验证文件完整性。尽管由于安全问题不推荐用于高安全场景,但在一些场景下仍用于文件校验。最佳实践包括定期验证、保存校验文件和与其他命令结合使用。

相关产品

  • 物联网平台