嵌入式系统学习Day16(C语言中的位运算)
位运算
二进制位的运算
嵌入式:
通过位运算 控制 硬件
运算:
运算规则
& 与 一假则假
| 或 一真则真
~ 非 真假相对
^ 异或 相同为假 不同为真
<< 左移 表示二进制位的移动
>> 右移
eg:
int a = 0x55;
int b = 0x33;
0101 0101 //0x55
&0011 0011 //0x33
---------------------
0001 0001 //0x11
a & b =>
int a = 0x55;
int b = 0x33;
0101 0101 //0x55
|0011 0011 //0x33
---------------------
0111 0111 //0x77
a | b =>
取反:
int a = 0x55;
~a
0101 0101 //0x55
1010 1010 //0xaa
用途:
控制二进制 -- 进而控制硬件
微控制器:
寄存器
写程序 --- 控制 --- 寄存器的 -- 二进制位
C 控制硬件
51
stm32
arm系列CPU
与 运算 --- 清零
或 运算 --- 置1
int a = 0x55;
0101 0101 //0x55
1111 1110
--------------------
0101 0100 //清零
取反运算
0101 0101 //0x55
~1
1111 1110
<<
eg:
a<<n
表示,将数值 a 左移 n位
int a = 1;
3210
0000 0001 //1 0
0000 0010 //2 1
0000 0100 //4 2
0000 1000 //8 3
左移,每左移一位 相当于 乘以 2
1 << 1
取反运算
0101 0101 //0x55
1<<4
1
~1
1110 1111
0101 0101 //0x55
----------
0100 0101 // 0101 0101 //0x55
4 5
int a = 0x55;
a & ~(1<<4)
置1
int a = 0x55;
0101 0101 //0x55
| 1<<n
--------------------
0101 0111 //0x57
^ 异或 相同为假 不同为真
//加密
int a = 0x35;
0011 0101 //0x35
^0000 0110 //0x6
-------------------
0011 0011 //0x33
0000 0110 //0x6
------------------
0011 0101 //0x35
实现两个数交换
int t = a;
a = b;
b = t;
//不使用第三方变量 实现两数交换
a = a + b;
b = a - b;
a = a - b;
a = a ^ b;
b = a ^ b;
a = a ^ b;
a 0011 0101 //0x35
b ^0000 0110 //0x6
---------------------
0011 0011 //0x33 //a
0000 0110 //0x6 //b
------------------
0011 0101 //0x35 //原来的 a
0011 0011 //0x33
------------------
0000 0110 //0x6
注意:
1.浮点数 不能做位运算
>>
右移
a>>n //将a向右移动n位
0000 1000 // 8
0000 100 0
最高位 补什么
逻辑右移 区别在于看要移动数据是否有符号 ---默认最高位 补0
算术右移 //有符号 --- 最高位 补 符号位
0000 1000 //8 //右移 相当于除以 2
0000 0100 //4
0000 0010 //2
0000 0001 //1