《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.7 技术升级:用宏定义来完成位运算

简介:

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

2.7 技术升级:用宏定义来完成位运算

在Linux内核源码中有很多函数,你一层一层地查看进去,会发现其最终实现其实是一些宏构成的。本节举几个用宏实现位运算的例子。

2.7.1 直接用宏来置位

用宏定义将一个32位二进制数x的第n位(从右边起算,也就是bit0算第1位)置位。

显然,这个宏含有两个参数,即x和n,所以其模型为 #define SET_BIT_N(x,n) xxx。

对其某一位置位,我们可以将该位和1相或,其他位和0相或即可,所以得到x | (1<<(n-1))。

所以该宏为#define SET_BIT_N(x,n) ((x) | (1<<((n)-1)))。

2.7.2 直接用宏来复位

用宏定义将一个32位二进制数x的第n位(右边起算,也就是bit0算第1位)清零。

显然,这个宏含有两个参数,即x和n,所以其模型为 #define CLR_BIT_N(x,n) xxx。

对其某一位清零,我们可以将该位和0相与,其他位和1相与即可,所以得到x & ~(1<<(n-1))。

所以该宏为#define CLR_BIT_N(x,n) ((x) & ~(1<<((n)-1)))

2.7.3 截取变量的部分连续位

这个宏比较复杂,我们单独拿出来分析它。相信有了上面几节的学习,理解起来也不会难。该宏实现的是截取指定的连续位(n~m)作为一个新的值。例如变量0x88,也就是0b10001000,若截取第2~4位(bit0为第一位),则值为0b100 = 4。

define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))

我们看到上面这么一个复杂的宏怎么分析呢?提取对应的括号,将对应的括号分离出来,从最里边开始分析,然后将最里边视为一个整体,一层一层地向外边扩展分析。

分析:((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)) 提取最里边的括号对便是~(0U)<<(m-n+1),然后一层一层地往外面分析,如下所示。


d9842bf5fb0559d2945353cf4f3bede0f5048e1d

到目前,已经构造出来了bitn~bitm连续为1,其余位都为0的数。由前面的几节可知,将这个数与操作数x相与即可从操作数x截取到bitn~bitm位为原数不变,其余位全为0的数。假设该数为Y。
Y = (x & ~(~(0U)<<(m-n+1))<<(n-1))

然后只要再将Y右移位(n-1),即可得到以bitn~bitm构成的新数。

课后题
1.嵌入式系统中常常要求用户对变量或者寄存器进行位操作,下面的函数分别用于设置和清除变量a的第5位,请使用下面宏定义bit5,按要求对变量a进行相应的处理,在函数set_bit5中,用位或赋值操作(|=)设置变量a的第5位。在函数clear_bit5中,用位与赋值操作(&=)清除变量a的第5位。(软考题)

define BIT5 (0X01<<5)

static int a;

void set_bit(void)
{

______;

}
void clear_bit5(void)
{

______;

}
2.请描述如下位操作的作用。

a |= (1 << 3); 

a |= (0b11111 << 3); 或a |= (~((~0) << 5) << 3);

a &= ~(1 << 15);

a &= ~(0b111111111 << 15); 或a &= ~(~((~0) << 9) << 15);

a &= (0b111111 << 3); 或a &= (~((~0) << 6) << 3);   

3.请解释如下两个宏的含义。

#define SET_NTH_BIT(x, n) (x | ((1U)<<(n-1)))

#define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1)))

4.截取变量的部分连续位,例如变量0x88, 也就是10001000,若截取第2~4位,则值为010 = 2,最右边从第0位算起,假设m=4,n=2。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
13天前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
38 3
|
1天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
15 4
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
思通数科AI平台在尽职调查中的技术解析与应用
思通数科AI多模态能力平台结合OCR、NLP和深度学习技术,为IPO尽职调查、融资等重要交易环节提供智能化解决方案。平台自动识别、提取并分类海量文档,实现高效数据核验与合规性检查,显著提升审查速度和精准度,同时保障敏感信息管理和数据安全。
42 11
|
2天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
3天前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
9天前
|
人工智能 安全 Linux
|
10天前
|
监控 Cloud Native 持续交付
云原生技术深度解析:重塑现代应用开发与部署范式####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在现代软件开发中的重要性。通过剖析容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,本文旨在揭示云原生技术如何促进应用的敏捷性、可扩展性和高可用性,进而推动企业数字化转型进程。不同于传统摘要仅概述内容要点,本部分将融入具体案例分析,直观展示云原生技术在实际应用中的显著成效与挑战应对策略,为读者提供更加丰富、立体的理解视角。 ####
|
10天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
25 1
|
11天前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验

热门文章

最新文章

相关产品

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