位運算
二進制位的運算
嵌入式:
通過位運算 控制 硬件
運算: ? ??
運算規則
& ?與 ? ?一假則假?
| ?或 ? ?一真則真
~ ?非 ? ?真假相對?
^ ?異或 ? 相同為假 不同為真?
<< 左移 ? 表示二進制位的移動?
>> 右移 ??
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?