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

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

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

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

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

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

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

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

-
嵌入式
+關(guān)注
關(guān)注
5150文章
19665瀏覽量
317415 -
C語言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141663 -
bit
+關(guān)注
關(guān)注
0文章
48瀏覽量
32449
發(fā)布評論請先 登錄
評論