C程式設計中位操作的常見技巧(含個人專案經驗)

2021-10-22 20:05:51 字數 2806 閱讀 2164

在c專案中,我們常常會遇到設定某個引數中的n位數值或者讀取某個引數的n位數值,如果每次都口算出整個引數的值再使用與或演算法那真的費時間,弄不好算錯了那就更麻煩了!

舉個例子:假設暫存器a為32bit長度暫存器,請將27位的值置位0?

如果你傻傻的有下面這個做法,那建議你把這篇文章看完,對你肯定有幫助。

做法:根據與或運算法則,算出當27位為0,其他位為1的32bit的值為

0xf7ffffff;

然後a &=0xf7ffffff;

為了杜絕上面的麻煩和錯誤的風險!

下面我列舉幾個常見的操作,也是本人寫**的操作:

宣告:以下說到的暫存器當然是可以讀取寫入的暫存器

寫操作:

1、把暫存器/變數的第n位清零,不改變其他位的數值

void a;

a= 0x12345678;

a &=~(1<<12);  //第12bit置0,其他不變;

同理:a &= ~(1<<27); //第27bit置0,其他不變;

公式:a &=~(1<2、把暫存器/變數的第n位起的連續m位清零,不改變其他位的數值

void a;

a = 0x12345678;

a &= ~(3<<1); //第1位起的連續2位清零

a &= ~(7<<2); //第2位起的連續3位清零

公式 a &= ~((2^m-1)<2^m-1表示的是m位都為1的二進位制的十進位制數值,比如3表示二進位制0b00000011,表示連續2位;7表示二級制0b00000111,表示連續3位;

3、把暫存器/變數的第n位置1,不改變其他位的數值

void a;

a = 0x12345678;

a |= (3<<1); //第1位起的連續2位置1

a |= (7<<2); //第2位起的連續3位置1

公式:a |=(1<4、把暫存器/變數的第n位起的連續m位置1,不改變其他位的數值

void a;

a = 0x12345678;

a |= (3<<1); //第1位起的連續2位置1

a |= (7<<2); //第2位起的連續3位置1

公式 a |= ((2^m-1)<2^m-1表示的是m位都為1的二進位制的十進位制數值,比如3表示二進位制0b00000011,表示連續2位;7表示二級制0b00000111,表示連續3位;

5、對暫存器/變數的第n位取反

void a;

a = 0x12345678;

a ^= (1<<1); //第1位取反

a ^= (1<<2); //第2位取反

公式:a ^= (1<讀操作:

1、讀暫存器/變數的第n位

void a,result;

a = 0x12345678;

result=a& (1<<2); //讀第2位

result=a& (1<<3); //讀低3位

公式:result=a& (1<2、讀暫存器/變數的第n位起的連續m位

void a,result;

a = 0x12345678;

result=a& (3<<2); //讀第2位開始的連續2位資料

result=a& (3<<27); //讀第27位開始的連續2位資料

公式result=a& ((2^m-1)<2^m-1表示的是m位都為1的二進位制的十進位制數值,比如3表示二進位制0b00000011,表示連續2位;7表示二級制0b00000111,表示連續3位;

像這種操作,判斷時可以完全脫離位置的計算,只需看變數名稱就可操作!

下面這些是別人廠家的庫函式:也是如此定義

清除的操作:

清除置位都有的函式,只需傳入上面巨集定義的引數即可操作;

1、我的第一步操作就是使用位移操作巨集定義故障原因,如下1,以及乙個快取故障原因的快取變數,如圖2;

圖1

圖22、構建獲取相應故障狀態的函式,如下操作:

3、構建清除相應故障狀態的函式,如下操作:

4、構建設定相應故障狀態的函式,如下操作:

最後只需呼叫,傳入相應的故障巨集定義即可!這樣做的話,直接讀函式名就可以知道該函式的作用!避免當列舉太多,導致混亂!

C 中的位操作

位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 按位與 按位或 按位取反 左移 右移 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 conso...

C 中的位操作

位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 console.writeline b b 6的...

C 中的位操作

位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 console.writeline b b 6的...