C語言位操作技巧

2021-08-22 06:18:52 字數 1656 閱讀 1219

c語言位操作

2023年06月04日 16:51:00

閱讀數:1553

此文將花費您8~15分鐘時間,帶您對嵌入式中常用的位操作有個了解。和數位電路有點相似!感謝閱讀!

位操作符

1.位與&

1、注意:位與符號是乙個&,兩個&&是邏輯與。

2、真值表:1&0=01&1=10&0=00&1=0

3、從真值表可以看出:位與操作的特點是,只有1和1位與結果為1,其餘全是0.

4、位與和邏輯與的區別:位與時兩個運算元是按照二進位制位彼次對應位相與的,邏輯與是兩個運算元作為整體來相與的。(舉例:0xaa&0xf0=0xa0,0xaa && 0xf0=1)

2.位或|

1、注意:位或符號是乙個|,兩個||是邏輯或。

2、真值表:1|0=11|1=10|0=00|1=1

3、從真值表可以看出:位或操作的特點是:只有2個0相位或才能得到0,只要有1個1結果就一定是1.

4、位或和邏輯或的區別:位或時兩個運算元是按照二進位制位彼次對應位相與的,邏輯或是兩個運算元作為整體來相或的。

3.位取反~

1、注意:c語言中位取反是~,c語言中的邏輯取反是!

2、按位取反是將運算元的二進位制位逐個按位取反(1變成0,0變成1);而邏輯取反是真(在c語言中只要不是0的任何數都是真)變成假(在c語言中只有0表示假)、假變成真。

實驗:2.擷取變數的部分連續位。例如:變數0x88, 也就是0b10001000,若擷取第2~4位,則值為:0b100 = 4

分析:這個題目相當於我們位運算實戰演練1中5.做的事情,只不過要用巨集來實現。

這個題目相當於是要把x的bit(n-1)到bit(m-1)取出來

注:優先順序~ 高於 《高於&

u表示unsigned int-32

複雜巨集怎麼分析:

((x & ~(~(0u)<<(m-n+1))<<(n-1)) >> (n-1))

第一步,先分清楚這個複雜巨集分為幾部分:2部分

@(x & ~(~(0u)<<(m-n+1))<<(n-1))

@>>(n-1)

分析為什麼要》(n-1),相當於是我們5.中的第二步(第二步,再將其右移3位得到結果。)

第二步,繼續解析剩下的:又分為2部分

@x&

@~(~(0u)<<(m-n+1))<<(n-1)

分析為什麼要&,相當於我們5中的第一步 (第一步:先將這個數bit3~bit8不變,其餘位全部清零。)

第三步,繼續分析剩下的:

~ (~(0u)<<(m-n+1))<<(n-1)

這個分析時要搞清楚第2坨到底應該先左邊取反再右邊<<;還是先右邊《再左邊取反。

解法:第一,查c語言優先順序表;第二,自己實際寫個**測試。

說明這個式子應該是 ~(~(0u)<<(m-n+1))<<(n-1) ,這就又分為2部分了

0x88:10001000

例如:變數0x88, 也就是0b10001000,若擷取第2~4位,則值為:0b100 = 4

~(~(0u)<<(m-n+1))<<(n-1)):00001110

(x & ~(~(0u)<<(m-n+1))<<(n-1)):00001000

(x & ~(~(0u)<<(m-n+1))<<(n-1)) >> (n-1):00001000

C 位操作技巧

一 注意事項 a 與 兩位都為1,才為1 b 或 兩位都為0,才為0 c 微操作只能用於整形資料,float和double進行位操作時編譯器會報錯 d 異或 兩位相同為0,不同為1 e 取反 1變為0,0變為1 f 左移 各二進位制全部向左移位,高位丟失,低位補零 g 右移 各二進位制全部向右移位,...

C 位操作技巧

一 注意事項 a 與 兩位都為1,才為1 b 或 兩位都為0,才為0 c 微操作只能用於整形資料,float和double進行位操作時編譯器會報錯 d 異或 兩位相同為0,不同為1 e 取反 1變為0,0變為1 f 左移 g 右移 各二進位制全部向右移位,對於無符號數,低位丟失,高位補零 有符號數個...

C語言位操作

在電腦程式中,資料的位是可以操作的最小資料單位,理論上可以用 位運算 來 完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做資料變換使用,但是,靈活的位操作可以有效地提高程式執行的效率。c語言提供了位運算的功 能,這使得c語言也能像組合語言一樣用來編寫系統程式。位運算子c語言提供了六種位運算...