C語言位操作

2021-08-13 14:13:53 字數 2681 閱讀 5384

1、位與、位或、位異或的特點總結及使用:

位與:(任何數,其實就是1或者0)與1位與無變化,與0位與變成0特定位清0(&)特定位為0,其他位為1

位或:(任何數,其實就是1或者0)與1位或變成1,與0位或無變化特定位置1(|)特定位為1,其他位為0

位異或:(任何數,其實就是1或者0)與1位異或會取反,與0位異或無變化特定位取反(^)特定位為1,其他位為0

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

(舉例:0xaa&0xf0=0xa0,0xaa && 0xf0=1)

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

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

位邏輯與 &&&

取反~!!

【總結】:

任何非0的數被按邏輯取反再取反就會得到1;(~~a)

任何非0的數倍按位取反再取反就會得到他自己;(!!a)

用巨集直接置位(置1)和復位(置0):

置位:#define set_nth_bit(x, n)  (x | ((1u)<<(n-1)))【巨集定義後面被定義部分必須用括號括起來】

復位:#define clear_nth_bit(x, n) (x & ~((1u)<<(n-1)))

2、位運算實戰演練

要置1用|,用清零用&,要取反用^,~和<< >>用來構建特定二進位制數。

1、給定乙個整型數a,設定a的bit3,保證其他位不變。

a = a | (1<<3)或者 a |= (1<<3)

2、給定乙個整形數a,設定a的bit3~bit7,保持其他位不變。

a = a | (0b11111<<3)或者 a |= (0x1f<<3);

3、給定乙個整型數a,清除a的bit15,保證其他位不變。

a = a & (~(1<<15));或者 a &= (~(1<<15));

4、給定乙個整形數a,清除a的bit15~bit23,保持其他位不變。

a = a & (~(0x1ff<<15));或者 a &= (~(0x1ff<<15));

5、給定乙個整形數a,取出a的bit3~bit8。

思路:第一步:先將這個數bit3~bit8不變,其餘位全部清零。

第二步,再將其右移3位得到結果。

第三步,想明白了上面的2步演算法,再將其轉為c語言實現即可。

a &= (0x3f<<3);

a >>= 3;

6、用c語言給乙個暫存器的bit7~bit17賦值937(其餘位不受影響)。

關鍵點:第一,不能影響其他位;第二,你並不知道原來bit7~bit17中裝的值。

思路:第一步,先將bit7~bit17全部清零,當然不能影響其他位。

第二步,再將937寫入bit7~bit17即可,當然不能影響其他位。

a &= ~(0x7ff<<7);

a |= (937<<7);

7、用c語言將乙個暫存器的bit7~bit17中的值加17(其餘位不受影響)。

關鍵點:不知道原來的值是多少

思路:第一步,先讀出原來bit7~bit17的值

第二步,給這個值加17

第三步,將bit7~bit17清零

第四步,將第二步算出來的值寫入bit7~bit17

8、用c語言給乙個暫存器的bit7~bit17賦值937,同時給bit21~bit25賦值17.

思路:4.2.4.6的公升級版,兩倍的4.2.4.6中的**即可解決。

分析:這樣做也可以,但是效果不夠高,我們有更優的解法就是合兩步為一步。

3、巨集定義位操作。

1、直接用巨集來置位、復位(最右邊為第1位)

#define set_nth_bit(x, n)  (x | ((1u)<<(n-1)))

#define clear_nth_bit(x, n) (x & ~((1u)<<(n-1)))

2、擷取變數的部分連續位。例如:變數0x88, 也就是10001000b,若擷取第2~4位,則值為:100b = 4 

#define getbits(x, n, m) ((x & ~(~(0u)<<(m-n+1))<<(n-1)) >> (n-1)) 相當於是要把x的bit(n-1)到bit(m-1)取出來

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

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

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

分析為什麼要》(n-1),相當於是我們4.2.4.5中的第二步

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

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

分析為什麼要&,相當於我們4.2.4.5中的第一步

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

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

<<(n-1) 

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

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

說明這個式子應該是~(~(0u)<<(m-n+1))

<<(n-1) ,這就又分為2部分了

C語言位操作

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

c語言位操作

位運算 and與 有一位為0 運算就為0 想獲取高四位,a a 0xf0 簡寫 a 0xf0 清零 一三五七位清零 a a 0x55 檢測位 檢測第三位 a a 0x04 遮蔽高四位,保留低4 位 a a 0x0f 統計2進製a中1的個數 1 include2 int main 3 11 print...

C語言位操作

朱老師物聯網大講堂 學習筆記 1 位與 只有1 1才是1,其餘全是0,位或 只有0 0才是0,其餘全是1,位取反 按位操作,位異或 1 0 1 0 1 1,也就是說相異結果是1,與1異或會取反,與0異或無變化,移位分 左 右 移,物件分 有 無符號數,只說一點 有符號數右移左側補符號位,叫算術移位,...