| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32笔记D8 -> 正文阅读 |
|
[嵌入式]STM32笔记D8 |
位操作运算一、位操作符:1.位与&(两个&&是逻辑与) 1&0=0 ?1&1=1 ?0&0=0 ?0&1=0 位与和逻辑与的区别:位与时两个操作数是按照二进制位批次对应位相与的;逻辑与是两个操作数作为整体来相与的。 2.位或|(两个||是逻辑或) 1|0=1 ?1|1=1 ?0|0=0 ?0|1=1 位与和逻辑或的区别:位或时两个操作数是按照二进制位批次对应位相或的;逻辑或是两个操作数作为整体来相或的。 3.位取反~(逻辑取反是!) 按位取反是将操作数的二进制位逐个按位取反(1变成0,0变成1);而逻辑取反是真(只要不是的任何数都是真)变成假(只有0表示假)、假变成真。 4.位异或^ 1^1=0 ?0^0=0 ?1^0=1 ?0^1=1 2个数如果相等为0,不等为1。 5.左移位<<;右移位>> c语言移位取法于数据类型。 对于无符号数,左移时右侧补0;(相当于逻辑移位) 对于无符号数,右移时左侧补0;(相当于逻辑移位) 对于有符号数,左移时右侧补0;(叫算术移位,相当于逻辑移位) 对于有符号数,右移时左侧补符号位。(如果正数就补o,负数就补1,叫算术移位) 位与、位或、位异或的特点总结: 位与:(任何数,其实就是1或者0)与1位与无变化,与0位与变成0 位或:(任何数,其实就是1或者0)与1位或变成1,与0位或无变化 位异或:(任何数,其实就是1或者0)与1位异或会取反,与0位异或无变化 二、位与位或位异或在操作寄存器的特殊作用1.特定位清零用& (1)位与操作的特点:(任何数,其实就是1或者0)与1位与无变化,与0位与变成0。 (2)如果希望将一个寄存器的某些特定位变成0而不影响其他位,可以构造一个合适的1和0组成的数和这个寄存器原来的值进行位与操作,就可以将特定位清零。(举例:设原来32位寄存器中的值为:0xAAAAAAAA,希望将bit8~bit15清零而其他位不变,可以将这个数与0xFFFFOOFF进行位与即可) 2.特定位置1用| (1)位或操作特点:(任何数,其实就是1或者0)与1位或变成1,与0位或无变化。 (2)要构造这样一个数:要置1的特定位为1,其他位为0,然后将这个数与原来的数进行位或即可。 3.特定位取反用^ (1) 位异或操作特点:(任何数,其实就是1或者0)与1位异或会取反,与0位异或无变化。 (2)要构造这样一个数:要取反的特定位为1,其他位为0,然后将这个数与原来的数进行位异或即可。 三、用位运算构建特点二进制数1.用移位获取特定位位1的二进制数 (1)如需要一个bit3~bit7为1的二进制数,可以这样:(0x1f<<3) (2)难一点的要求:获取bit3~bit7为1,同时bit23~bit25为1,其余位为o的数:((0x1f<<3)|(7<<23)) 2.结和位取反获得特定位为0的二进制数 (1)先试图构造出这个数的位相反数,再取反得到这个数。(如本例中要构造的数bit4~bit10为0其余位为1,那我们就先构造一个bit4~bit10为1,其余位为0的数,然后对这个数按位取反即可) 四、实例训练1.给定一个整型数a,设置a的bit3,保证其他位不变。 a=a | (1<<3); 2.给定一个整形数a,设置a的bit3~bit7,保持其他位不变。 a=a | ( 0b11111<<3); 3.给定一个整型数a,清除a的bit15,保证其他位不变。 a=a & (~( 1<<15) ); 4.给定一个整形数a,清除a的bit15~bit23,保持其他位不变。 a=a & (~(0x1ff<<15)); 5.给定一个整形数a,取出a的bit3~bit8。 思路: 第一步:先将这个数bit3~bit8不变,其余位全部清零。 第二步,再将其右移3位得到结果。 a &=(0x3f<<3);a >>= 3; 6.用c语言给一个寄存器的bit7~bit17赋值937(其余位不受影响`) 思路: 第一步,先将bit7~bit17全部清零,不能影响其他位。 第二步,再将937写入bit7~bit17即可。 7.用c语言将一个寄存器的bit7~bit17中的值加17(其余位不受影响)。 思路: 第一步,先读出原来bit7~bit17的值 第二步,给这个值加17 第三步,将bit7~bit17清零 第四步,将第二步算出来的值写入bit7~bit17
8.用c语言给一个寄存器的bit7~bit17赋值937,同时给bit21~bit25赋值17。 五、宏定义来完成位运算第一题:用宏定义将32位数x的第n位(右边起算,也就是bit0算第1位)? ?置位 #define SET_BIT_N(x, n)? (x | (1U<<(n-1))) 第二题:用宏定义将32位数x的第n位(右边起算,也就是bit0算第1位)? ?清零 #define CLEAR_BIT_N(x,n) ?(x & ~(1U<<(n-1))) 第三题:用宏定义将32位数x的第n位到第m位(右边起算,也就是bit0算第1位,m是高位) 置位 思路:第1步:先得到32位1:???? ~0U ? ? ? ? 第2步:将第1步得到的数右移x位即可得到(m-n+1)个1???????? (~0U)>>(32-(m-n+1)) #define SET_BIT_N_M(x, n,m)??(x|(((~0U)>>(32-(m-n+1)))<<(n-1))) 第四题:截取变量的部分连续位。 相当是要把x的bit(n-1)到bit(m-1)取出来。 #define GETBITS(x,n,m)? ((x & ~(~(0U)<<(m-n+1))<<(n-1))>>(n-1) |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:37:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |