IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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即可。
a &= ~(0x7ff<<7);a |= (937<<7) ;

7.用c语言将一个寄存器的bit7~bit17中的值加17(其余位不受影响)。

思路:

第一步,先读出原来bit7~bit17的值

第二步,给这个值加17

第三步,将bit7~bit17清零

第四步,将第二步算出来的值写入bit7~bit17

unsigned int a =0xc30288f8;
unsigned int tmp = 0 ;
tmp = a & (0x3ff<<7);
tmp >>= 7;
tmp += 17;
a |= tmp<<7;
printf ( "a = 0x%x\n",a);

8.用c语言给一个寄存器的bit7~bit17赋值937,同时给bit21~bit25赋值17。
a? &=? ~((0x3ff<<7)|(0xlf<<21));
a? |=? ((937<<7)|(17<<21));


五、宏定义来完成位运算

第一题:用宏定义将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例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:12:35  更:2021-08-30 12:13:01 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码