论坛网站推广方案,网站如何吸引蜘蛛,wordpress类别生成标签,群晖搭建wordpress修改固定链接C语言的位运算符用于直接操作二进制位#xff0c;本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。
一、位运算符的简单说明
1、按位与运算符#xff08;#xff09;
功能#xff1a;按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…C语言的位运算符用于直接操作二进制位本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。
一、位运算符的简单说明
1、按位与运算符
功能按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制位都是1则结果为1否则为0。有0为0全1为1示例 int a 5; // 0101
int b 3; // 0011
int result a b; // 0001 - 12、按位或运算符|
功能按位或运算符对两个操作数的每一位执行或操作。如果两个对应的二进制位中至少有一个是1则结果为1否则为0。有1为1全0为0示例 int a 5; // 0101
int b 3; // 0011
int result a | b; // 0111 - 73、按位异或运算符^
功能按位异或运算符对两个操作数的每一位执行异或操作。如果两个对应的二进制位相同则结果为0如果不同则结果为1。相同为1不同为0示例 int a 5; // 0101
int b 3; // 0011
int result a ^ b; // 0110 - 6补充 按位异或运算符也可以用来交换2个变量的数值。交换2个变量1的数值我们常用的方法是定义一个临时变量来暂时存储一个变量的值当如果不想多定义一个变量就可以采用按位异或运算符来操作具体方法如下
4、按位取反运算符~
功能按位取反运算符对操作数的每一位执行取反操作即将0变为1将1变为0。0变11变0示例 int a 5; // 0101
int result ~a; // 1010 - -6在补码表示下5、左移运算符
功能左移运算符将操作数的二进制位向左移动指定的位数。左移时空出的低位用0填充。整体左移低位补0高位不一定舍弃说明: 整体左移后结果取决于赋值给什么类型的变量从低到高截位并不是简单的高位舍弃如果高位没有舍弃数据左移一位就扩大一倍。如图示例 int a 5; // 0101
int result a 1; // 1010 - 106、右移运算符
功能右移运算符将操作数的二进制位向右移动指定的位数。对于无符号数空出的高位用0填充对于有符号数空出的高位根据符号位填充算术右移。整体右移低位舍弃有符号数高位补最高位的数字说明无符号数高位补0有符号数高位补最高位的数字数据右移一位就缩小一倍除以2并舍去余数。如图示例 int a 5; // 0101
int result a 1; // 0010 - 27. 复合赋值运算符
运算符也可以与赋值运算符组合形成复合赋值运算符
按位与赋值按位或赋值|按位异或赋值^左移赋值右移赋值
二、位运算符的运用
1、用按位与运算符将变量的某位置0
有一个变量char a 0b1111 1111,要将其的第n位置0最右一位为第0位只需要将其按位与上一个第n位为0其余为都为1的数据。
char a 0b11111111
char b 0b11110111
a b; 这样a的第3位就会被置0
2、用按位或运算符|将变量的某位置1
有一个变量char a 0b0000 0000,要将其的第n位置1最右一位为第0位只需要将其按位或上一个第n位为1其余为都为0的数据。
char a 0b00000000
char b 0b00001000
a | b; 这样a的第3位就会被置1
3、用左移运算符)和按位或运算符|进行数据合成 ①将两个8位数据合成一个16位数据 将第一个数据左移8位后按位或上第二个数据
#include stdio.hint main() {unsigned char a 0x34; // 8位数据十六进制34unsigned char b 0x12; // 8位数据十六进制12unsigned short result (a 8) | b; // 左移a并与b按位或合成16位数据printf(合成的16位数据: 0x%0X\n, result); // 输出0x3412return 0;
}②将两个16数据合成一个32位数据 将第一个数据左移16位后按位或上第二个数据
#include stdio.hint main() {unsigned short x 0x1234; // 16位数据十六进制1234unsigned short y 0xABCD; // 16位数据十六进制ABCDunsigned int result (x 16) | y; // 左移x并与y按位或合成32位数据printf(合成的32位数据: 0x%0X\n, result); // 输出0x1234ABCDreturn 0;
}③将一个8位数据和一个16位数据合成一个32位数据
#include stdio.hint main() {unsigned char a 0x12; // 8位数据十六进制12unsigned short b 0xABCD; // 16位数据十六进制ABCDunsigned int result (a 16) | b; // 左移a和b并合成32位数据printf(合成的32位数据: 0x%0X\n, result); // 输出0x12ABCDreturn 0;
}4、截取一个数据的某部分字节 ①截取一个数据的低字节 截取低字节可以用赋值运算符或者强制转换。 例如截取0xABCD中的0xCD
#include stdio.hint main() {unsigned short a 0xABCD; // 16位数据十六进制ABCDunsigned char b a; // 将16位数据a赋值给8位数据bprintf(%0X\n, (unsigned char)a); // 强制转换为8位并输出低字节printf(%0X\n, b); // 输出b的值return 0;
}②截取一个数据的高字节或中间字节 截取高字节或中间字节可以将数据右移后再用赋值运算符或者强制转换
#include stdio.hint main() {unsigned short a 0xABCD; // 16位数据十六进制ABCDunsigned int b 0x1234ABCD; // 32位数据十六进制1234ABCD// 第一个 printf将 a 右移8位得到高字节然后转换为 unsigned charprintf(%0X\n, (unsigned char)(a 8));// 第二个 printf将 b 右移12位得到高字节部分的前两位然后转换为 unsigned charprintf(%0X\n, (unsigned char)(b 12));return 0;
}③分别截取一个数据的低字节中间字节和高字节合成一个新数据
#includestdio.hint main(void)
{unsigned short a 0xaabb;unsigned short b 0xccdd;unsigned short c 0xeeff;unsigned int d (a 0x00ff) | (b 0x0ff0)4 | (c 0xff00)8 ;printf(%x,d);
} 5、对寄存器进行操作
假设你有一个 u32 类型的变量 temp表示一个 32 位的寄存器。 ①对寄存器的某一位写0 将temp变量的第n位置0其他位不变 规律temp ~1 n) ②对寄存器的某一位写1 将temp变量的第n位置1其他位不变 规律temp | 1 n) ③对寄存器的某连续两位操作 1.将temp变量的第n和第n1位置0其他位不变 规律temp ~3 n) 2. 将temp变量的第n和第n1位置1其他位不变 规律temp | 3 n) 3.将temp变量的第n和第n1位置01或10其他位不变 先将第n和第n1位清0 temp ~1 n) 01temp | 1 n) 10temp | 2 n) 4.将temp的第2位第4位第5位置0其他位保持不变 temp ~ (12|14|15); 5.将temp的第n位进行翻转其他位保持不变 temp ^ (1n);
三、位运算操作GPIO寄存器_LED
本篇示例所用的芯片型号为STM32F103先创建好keil工程并配置好环境。
要操作LED灯的亮灭我们要将对于GPIO端口设置为通用推挽输出模式。
这是一个已经创建好的keil工程目前只有一个延时函数和基本的框架接下来我们通过查找芯片手册配置寄存器来点亮LED灯。 通过原理图我们可以看出LED0接在PB5端口上LED1接在PE5端口上。 因此要点亮LED0和LED1我们就需要对PB5和PE5端口进行操作端口输出低电平灯亮输出高电平灯灭。
我们翻看芯片手册的目录找到系统架构 。 可以看到 GPIOB和GPIOE都是挂载在APB2总线上的因此我们首先需要对APB2进行时钟使能。 翻看目录找到APB2 外设时钟使能寄存器(RCC_APB2ENR)。
要开启IO端口B和IO端口的时钟我们需要将寄存器RCC_APB2ENR的位3和位6置1。 具体操作如下 接着翻看目录找到端口配置寄存器。
我们需要将PB5和PE5设置为通用推挽输出模式 PB5和PE5的配置方法是一样的需要将寄存器GPIOx_CRL的位21和位20置01位23和位22置00。
具体操作如下
最后找到端口输出数据寄存器(GPIOx_ODR) (xA..E)
将寄存器GPIOB_ODR/GPIOE_ODR的位5置1则端口PB5/PE5输出高电平置0则输出低电平。 具体操作如下 烧录后效果如下 LED