【ARM 嵌入式 C 入门及渐进 12.3 -- 将数值的第 s 位到 e 位清零】

请阅读【嵌入式开发学习必备专栏】


文章目录

    • [将数值的第 s 位到 e 位清零](#将数值的第 s 位到 e 位清零)

将数值的第 s 位到 e 位清零

为了定义一个VAL_CLR_BITS(val, s, n)宏,该宏将变量val的第s位到第n位清零(假设n >= s),其余位的值保持不变,我们可以使用位操作来实现这一目标。以下是宏的一个可能实现:

c 复制代码
#define VAL_CLR_BITS(val, s, n) ((val) & (~(((1ULL << ((n) - (s) + 1)) - 1) << (s))))

这个宏的工作原理如下:

  1. 1ULL << ((n) - (s) + 1):首先将1(使用unsigned long long类型以确保宽度)左移(n - s + 1)位。这样做的目的是创建一个值,其中有(n - s + 1)个1位,与val中从sn位对应的位数相同。
  2. -1:然后,从这个值中减去1,这会将所有的1位左移后的结果变为0,其余为1。
  3. << (s):接着,将上一步得到的值左移s位,这样就将清零的位对准了val的第s位到第n位。
  4. ~:然后对上一步的结果取反,这会将要清零的位变为0,其余位变为1。
  5. &:最后,使用与操作&val与第4步得到的掩码进行位与操作。由于掩码中第s位到第n位为0,其余位为1,因此这一操作将清零val的第s位到第n位,而保留其余位的值不变。
    下面是一个如何使用VAL_CLR_BITS宏的示例:
c 复制代码
#include <stdio.h>

#define VAL_CLR_BITS(val, s, n) ((val) & (~(((1ULL << ((n) - (s) + 1)) - 1) << (s))))

int main(void) 
{
    unsigned int val = 0xFFFF; // 16位宽的值,初始全为1
    unsigned int s = 4; // 起始位
    unsigned int n = 7; // 结束位
    
    unsigned int result = VAL_CLR_BITS(val, s, n);
    
    printf("Original value: 0x%X\n", val);
    printf("After masking: 0x%X\n", result);
    
    return 0;
}

这段代码将输出val的原始值和应用VAL_CLR_BITS宏后的结果。在这个示例中,val初始值为0xFFFF,即所有位都是1。应用VAL_CLR_BITS(val, 4, 7)后,结果将是0xFF0F,即第4位到第7位被清零。

相关推荐
思麟呀14 小时前
在C++基础上理解CSharp-1
开发语言·c++·c#
一念春风14 小时前
QwenPaw(替代小龙虾)大模型
开发语言·php
小短腿的代码世界14 小时前
Qt状态机框架深度解析:从状态图到事件驱动闭环
开发语言·qt
广州灵眸科技有限公司15 小时前
瑞芯微(EASY EAI)RV1126B 模型部署API说明
linux·开发语言·网络·人工智能·深度学习·算法·yolo
東隅已逝,桑榆非晚15 小时前
深⼊理解指针(5)
c语言·笔记·算法
计算机安禾15 小时前
【c++面向对象编程】第20篇:override与final关键字:现代C++对继承的控制
开发语言·c++
AI科技星15 小时前
全域数学:从理论到现实的终极落地全记录 光速不变公理(v=c)+ 可见派维度常数公理(D_v=3)统一广义相对论与量子力学,解决物理学百年难题
c语言·开发语言
ch.ju15 小时前
Java程序设计(第3版)第三章——数组的定义方式
java·开发语言
郝学胜-神的一滴15 小时前
Qt 高级开发 004: 三大窗口类深度解析
开发语言·c++·qt·程序人生·系统架构
无风听海15 小时前
OAuth 2.0 response_type完全指南
java·开发语言·oauth