在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的...