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


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


文章目录

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

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

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

#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宏的示例:
#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位宽的值,初始全为1unsigned 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位被清零。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统集成项目管理工程师第4章思维导图发布

2024年开年&#xff0c;软考系统集成项目管理工程师官方教程&#xff0c;迎来了阔别7年的大改版&#xff0c;改版之后的软考中项考试&#xff0c;离同宗兄弟高项考试渐行渐远。 中项第3版教程&#xff0c;仅仅从教程来看&#xff0c;其难度已经不亚于高级的信息系统项目管理师&…

数据结构与算法学习笔记三---循环队列的表示和实现(C语言)

目录 前言 1.为啥要使用循环队列 2.队列的顺序表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.空队列 6.队列长度 7.获取队头 8.入队 9.出队 10.遍历队列 11.完整代码 前言 本篇博客介绍栈和队列的表示和实现。 1.为啥要使用循环队列 上篇文章中我们知道了顺序队列…

Hive Transaction事务表(含实现原理)

Hive Transaction事务表 在Hive中&#xff0c;事务表&#xff08;Transactional Tables&#xff09;允许用户执行事务性操作&#xff0c;包括ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性。事务表是在Hive 0.14版本引入的&#xff0c;并且在后续版本中不断…

LabVIEW天然气压缩因子软件设计

LabVIEW天然气压缩因子软件设计 项目背景 天然气作为一种重要的能源&#xff0c;其压缩因子的准确计算对于流量的计量和输送过程的优化具有关键意义。传统的计算方法不仅步骤繁琐&#xff0c;而且难以满足现场快速响应的需求。因此&#xff0c;开发一款既能保证计算精度又便于…

使用Pandas对Data列进行基于顺序的分组排列

目录 一、引言 二、Pandas库简介 三、按照数据列中元素出现的先后顺序进行分组排列 四、案例分析 五、技术细节探讨与扩展应用 1. 技术细节 2. 扩展应用 3. 示例代码&#xff1a;用户行为分析 4. 进阶应用&#xff1a;分组后的聚合操作 5. 分组后的数据筛选 6. 分组…

【DevOps】Linux 安全:iptables 组成、命令及应用场景详解

导读&#xff1a;全面掌握 iptables&#xff1a;从基础到实践 在 Linux 系统中&#xff0c;iptables 是一个非常强大的工具&#xff0c;它不仅是系统管理员用来构建和管理网络防火墙的首选工具&#xff0c;而且也是一个功能丰富的网络流量处理系统。无论是进行包过滤、监控网络…

学习笔记:【QC】Android Q qmi扩展nvReadItem/nvWriteItem

一、qmi初始化 流程图 初始化流程: 1、主入口&#xff1a; vendor/qcom/proprietary/qcril-hal/qcrild/qcrild/rild.c int main(int argc, char **argv) { const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **); rilInit RIL_Init; funcs rilInit…

孩子通过编程可以收获什么?

编程是一种高度创造性的活动&#xff0c;它可以帮助孩子们培养出许多有价值的技能和品质。通过学习编程&#xff0c;孩子们可以收获以下几点&#xff1a; 逻辑思维能力 编程是一种需要严密的逻辑思维和分析能力的活动。在编程过程中&#xff0c;孩子们需要理清思路&#xff0c;…

李彦宏回顾大模型重构百度这一年

“大模型我们走在最前面&#xff0c;我们需要去勇闯无人区&#xff0c;需要去冒前人没有冒过的风险。”近日&#xff0c;在百度一场内部颁奖活动中&#xff0c;百度创始人、董事长兼首席执行官李彦宏指出&#xff0c;百度一直坚信技术可以改变世界&#xff0c;会一直沿着这条路…

docker的centos容器使用yum报错

错误描述 学习docker过程中&#xff0c;基于 centos 镜像自定义新的镜像。拉取一个Centos镜像&#xff0c;并运行容器&#xff0c;容器安装vim&#xff0c;报错了。 报错&#xff1a;Error: Failed to download metadata for repo appstream: Cannot prepare internal mirror…

python视频转码脚本

今天有一个临时的需求&#xff0c;就是需要将一个wmv的初步转码成mp4的格式。找了一圈&#xff0c;免费的工具少&#xff0c;即使有免费的工具&#xff0c;在功能上也是有所限制&#xff0c;或者会给你塞广告或者附带安装其它流氓小游戏或者杀毒程序。 我并非不支持正版&#…

C++面向对象学习笔记五

本文主要讲解运算符重载&#xff0c;由于白鳯大佬没有具体讲解&#xff0c;所以本文自行补充了运算符重载的相关知识 目录 文章目录 前言 运算符重载 加号运算符重载 左移运算符重载 递增运算符重载 总结 前言 本文主要对于运算符重载进行探讨&#xff0c;分别对于成员函数重…

JVM 类加载机制

JVM 类加载机制分为五个部分&#xff1a;加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化&#xff0c;下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段&#xff0c;这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…

C语言经典例题-9

1.简单计算器 题目描述&#xff1a; KK实现一个简单计算器&#xff0c;实现两个数的“加减乘除”运算&#xff0c;用户从键盘输入算式“操作数1运算符操作数2”&#xff0c;计算并输出表达式的值&#xff0c;如果输入的运算符号不包括在&#xff08;、-、*、/&#xff09;范围…

Navicat Premium安装pojie版

下载、安装mysql&#xff0c;环境变量配置 1、官网下载mysql&#xff1a;https://www.mysql.com/downloads/ 下载成功&#xff0c;进行安装 一直点下一步 验证&#xff0c;开始中搜索mysql 说明安装成功 环境变量配置 默认安装路径C:\Program Files\MySQL …

向量检索和关键字检索的区别?

向量检索&#xff08;Vector Retrieval&#xff09;和关键字检索&#xff08;Keyword Retrieval&#xff09;是信息检索领域中常见的两种检索方法&#xff0c;它们有一些显著的区别&#xff1a; 1、检索方式&#xff1a; 向量检索&#xff1a;向量检索是基于文档和查询之间的相…

Kafka和Spark Streaming的组合使用学习笔记(Spark 3.5.1)

一、安装Kafka 1.执行以下命令完成Kafka的安装&#xff1a; cd ~ //默认压缩包放在根目录 sudo tar -zxf kafka_2.12-2.6.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.12-2.6.0 kafka-2.6.0 sudo chown -R qiangzi ./kafka-2.6.0 二、启动Kafaka 1.首先需要启动K…

计算机毕业设计Python地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Flink Hadoop 深度学习 机器学习 人工智能 知识图谱

学生信息 姓名&#xff1a;  祁浩 题目&#xff1a; 基于Python的中国地震数据分析与可视化系统的设计与实现 学号&#xff1a; 2020135211 班级&#xff1a; 20大数据本科2班 指导教师&#xff1a; 刘思思 答辩过程 学生开题陈述 为了让学习者更好的了解了解地震…

Coze扣子开发指南:AI零代码编程创建插件

在Coze扣子中创建插件&#xff0c;有两种方式&#xff0c;一是用API&#xff0c;具体方式参照上一篇文章《Coze扣子开发指南&#xff1a;用免费API自己创建插件》&#xff0c;还有一种方式就是编程&#xff0c;不过有了AI的帮助&#xff0c;即使不会编程的人&#xff0c;也可以…

HarmonyOS开发案例:【生活健康app之获取成就】(3)

获取成就 本节将介绍成就页面。 功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、…