C語(yǔ)言中,特別是在嵌入式的開(kāi)發(fā)中,位操作是很常用的一個(gè)知識(shí)點(diǎn),涉及到按位(bit)操作的地方也是很常見(jiàn)的。本文分享一些C語(yǔ)言中的位操作運(yùn)算的基礎(chǔ)內(nèi)容。
1、位與操作( & )
首先必須要區(qū)分位與(&)和邏輯與(&&),這兩者之間看上去就是多一個(gè)少一個(gè)的區(qū)別,但是最終運(yùn)算結(jié)果卻是完全不同的。位與 & 的真值表:

從上表可以看出,位與 & 的運(yùn)算原則是:只有當(dāng)參與運(yùn)算的兩個(gè)對(duì)象都是真(true 或 1)時(shí),得到的運(yùn)算結(jié)果才是 true 或 1 ,其它的都為flase 或 0。
位與 & 其實(shí)就是把參與運(yùn)算的兩個(gè)數(shù)先分別轉(zhuǎn)換為二進(jìn)制,然后再相與得到運(yùn)算之后的結(jié)果,如下:
比如:0x01&0x03=0x01//運(yùn)算如下:
0x01:0 0 0 1
0x03:0 0 1 1
結(jié)果: 0 0 0 1
2、位或操作 ( | )
首先必須要區(qū)分位與(|)和邏輯與(||),這兩者之間看上去就是多一個(gè)少一個(gè)的區(qū)別,但是最終運(yùn)算結(jié)果卻是完全不同的。位與 | 的真值表:

從上表可以看出,位與 | 的運(yùn)算原則是:只要當(dāng)參與運(yùn)算的兩個(gè)對(duì)象中有一個(gè)是真(true 或 1)時(shí),得到的運(yùn)算結(jié)果就是 true 或 1 ,只有兩個(gè)都是 0 才為 flase 或 0。位與 | 其實(shí)就是把參與運(yùn)算的兩個(gè)數(shù)先分別轉(zhuǎn)換為二進(jìn)制,然后再相與得到運(yùn)算之后的結(jié)果,如下:
比如:0x01 & 0x03 = 0x03 // 運(yùn)算如下:
0x01:0 0 0 1
0x03:0 0 1 1
結(jié)果: 0 0 1 1
3、位取反操作(~)
位取反就是把十六進(jìn)制數(shù)先轉(zhuǎn)換為二進(jìn)制,然后把對(duì)應(yīng)的位取反(1 取反變?yōu)?0,0 取反變?yōu)?)。
比如:
比如:0x01 、 0x03 // 運(yùn)算如下:
0x01:0 0 0 1 ~ 0x01:1 1 1 0 = 0x0D
4、位異或操作( ^ )
位異或 ^ 的真值表:

從上表可以看出,位異或 ^ 的運(yùn)算原則是:當(dāng)參與運(yùn)算的兩個(gè)對(duì)象中有一個(gè)是真(true 或 1)時(shí),得到的運(yùn)算結(jié)果就是 true 或 1 ;如果兩個(gè)都是 0 就為 flase 或 0;兩個(gè)都是 1 就為 flase 或 0。
總而言之就是:相同為0,不同為1。
比如:0x01 ^ 0x03 = 0x02 // 運(yùn)算如下:
0x01:0 0 0 1
0x03:0 0 1 1
結(jié)果: 0 0 1 0
5、位移操作(<< 、>>)
位移操作中,左移幾位就在右邊補(bǔ)幾個(gè)0,右移幾位就在左邊補(bǔ)幾個(gè)0,超出數(shù)值范圍的部分則丟棄。如下:

6、位操作的實(shí)際運(yùn)用
6.1、將特定位清零
如果想要把一個(gè)特定的數(shù)的某一個(gè)位清空(置零),使用位與 & 進(jìn)行操作。比如:

6.2、將特定位置 1
如果想要把一個(gè)特定的數(shù)的某一個(gè)位清空(置零),使用位與 & 進(jìn)行操作。比如:

6.3、特定位取反
如果想要把一個(gè)特定的數(shù)的某一個(gè)位取反,使用異或 ^ 進(jìn)行操作。比如:

注意:異或操作是相同為零,不同為1的運(yùn)算原則!
6.4、獲取特定二進(jìn)制位
如果想要獲取一個(gè)數(shù)中的某個(gè)或者某幾個(gè)特定的二進(jìn)制位,可以參考如下操作:

-
嵌入式
+關(guān)注
關(guān)注
5125文章
19438瀏覽量
313070 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139695 -
bit
+關(guān)注
關(guān)注
0文章
48瀏覽量
32291
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C語(yǔ)言基礎(chǔ)知識(shí)(4)--運(yùn)算符
C語(yǔ)言基礎(chǔ)(7)--位運(yùn)算

評(píng)論