news 2026/8/29 15:48:11

【c语言】1.3 嵌入式中的位运算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【c语言】1.3 嵌入式中的位运算
基础:
&& 逻辑与 & 位与
! 逻辑反 ~ 位取反
^ 位异或
c语言中的移位取决于数据类型
无符号:左移时右侧补0……
有符号:左移时右侧补0
有符号:右移时左侧补符号位!!!!
嵌入式中研究的移位,以及使用的移位都是无符号数
算术与逻辑:
算术左移同逻辑左移
算术右移移入的位用符号位填
逻辑右移移入的位用0填
特定位 清零 用 &
清零位为0,其他位为1
特定位 置1 用 |
置1位为1,其他位为0
特定位 置反 用 ^
取反位为1,其他位为0
关于构建那个特定的二进制数:
1.用工具
2.用移位的方法
例:bit3-bit7为1 先写出全部1 0xf1
后左移3位
例:bit3-bit7为1,bit23-bit25为1
分两部分,(0x1f<<3) | (0x7<<23)
例:bit4-bit10为0,其余位为1
还是以1为目标,这里面的0把1分成了2个部分: 0xf | (0x1fffff<<11)
也可以用取反操作来简化。
实践:
1.设置整型数a的bit3,其他位不变(注意 设置就是置1,清除是置0)
a |= (1<<3);
2.设置整型数a的bit3-bit7, 其他位保持不变
a |= (0x1f<<3)
3.清除整型数a的bit15,保证其他位不变
a &= (~(1<<15));
4.清除整型a的bit15-bit23,其他位保持不变
a &= (~(1ff<<15))
5.取出整型数a的bit3-bit8
先清零除了bit3-bit8的其他位,再右移3位 a &= ( 0x3f<<3); a >>= 3;
6.用c语言将一个寄存器的bit7-bit17赋值937,其他位不受影响
先将bit7-bit17全部清零,再把937赋值 a &=(~(0x7ff<<7); a |= (937<<7)
7.用c语言将一个寄存器的bit7-bit17加17,其余位不受影响
先读出来,加上17,将bit7-17清零,最后再写进去。定义一个临时变量Tmp, Tmp = a & (0x7ff<<7); tmp >>= 7; //取出来 tmp+=17; //加上17 a &= (~(0x7ff<<7)); a |= tmp;
用宏定义来完成位运算:
1、直接用宏来置位、复位(最右边为第1位
#define SET_BIT_N(x, n) (x | ((1U)<<(n-1))) //置位:x的第n位,注意其中的U表示无符号
#define CLEAR_BIT_N(x, n) (x & ~((1U)<<(n-1))) //复位:x的第n位
2、截取变量的部分连续位。例如:变量0x88, 也就是10001000b,若截取第2~4位,则值为:100b = 4
#define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))
这个题目相当于是要把x的bit(n-1)到bit(m-1)取出来
复杂宏怎么分析:
((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))
第一步,先分清楚这个复杂宏分为几部分:2部分
(x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)
分析为什么要>>(n-1),相当于是我们4.2.4.5中的第二步
第二步,继续解析剩下的:又分为2部分
x & ~(~(0U)<<(m-n+1))<<(n-1)
分析为什么要&,相当于我们4.2.4.5中的第一步
第三步,继续分析剩下的:
~ (~(0U)<<(m-n+1)) << (n-1)
这个分析时要搞清楚第2坨到底应该先左边取反再右边<<还是先右边<<再左边取反。
解法:第一,查C语言优先级表;第二,自己实际写个代码测试。
说明这个式子应该是 ~(~(0U)<<(m-n+1)) << (n-1) ,这就又分为2部分了
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 15:47:49

零基础写论文✅靠这一个工具,我全程零求助通关!

真的很想跟所有零基础、不会写论文的学弟学妹说一句&#xff1a;写论文真的不需要天赋&#xff0c;选对工具&#xff0c;小白也能轻松通关。我当初写毕业论文的时候&#xff0c;完全零基础&#xff0c;不会搭框架、不会找文献、不会降重、格式调不对&#xff0c;看着空白文档直…

作者头像 李华
网站建设 2026/8/29 15:46:42

如何在电脑上投屏并控制安卓手机:scrcpy 投屏工具完整教程

如何在电脑上投屏并控制安卓手机&#xff1a;scrcpy 投屏工具完整教程 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy scrcpy 是一款开源的 Android 投屏工具&#xff1a;手机通过 USB 连上…

作者头像 李华
网站建设 2026/8/29 15:45:26

2023工业峰会电机控制讲座:从PWM到FOC的实战干货笔记

2023工业峰会电机控制讲座资料&#xff0c;干货整理与实操笔记最近整理移动硬盘时翻出一批2023年工业峰会电机控制讲座的资料&#xff0c;包括PDF讲义、现场Demo工程和几个专家的答疑纪要&#xff0c;正好最近不少同行在后台问电机控制的入门路线和实操细节&#xff0c;我把这套…

作者头像 李华
网站建设 2026/8/29 15:45:03

Deep-Live-Cam 实时人脸换脸上手指南:3 步出第一个结果

Deep-Live-Cam 实时人脸换脸上手指南&#xff1a;3 步出第一个结果 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam Deep-Live-Cam 是一款…

作者头像 李华
网站建设 2026/8/29 15:44:58

数据管线的运行防线

数据管线的运行防线上个月我们团队搭建的一套 Python 自动化运维数据收集管线遇到了大麻烦。这套管线原本负责从 500 台服务器上拉取 Agent 实时上报的 syslog log 沉淀到 ClickHouse。到了月底促销活动期间&#xff0c;服务器节点临时扩容到了 4000 多台&#xff0c;日志写入量…

作者头像 李华