修改寄存器的位操作方法


 /******** 以下轉載至  野火's blog******************/

使用 C 語言對寄存器賦值時,我們常常要求只修改該寄存器的某幾位的值,且其它的
寄存器位不變,這個時候我們就需要用到 C 語言的位操作方法了。


1. 把變量的某位清零

此處我們以變量 a 代表寄存器,並假設寄存器中本來已有數值,此時我們需要把變量
a 的某一位清零,且其它位不變,方法見代碼
對某位清零

//定義一個變量 a = 1001 1111 b (二進制數)
unsigned char a = 0x9f;

//bit2 清零

a &= ~(1<<2); 

//括號中的 1 左移兩位, (1<<2)得二進制數: 0000 0100 b
//按位取反, ~(1<<2)1111 1011 b
//假如 a 中原來的值為二進制數: a = 1001 1111 b
//所得的數與 a 位與&”運算, a = (1001 1111 b)&(1111 1011 b),
//經過運算后, a 的值 a=1001 1011 b
// a bit2 位被被零,而其它位不變

2. 把變量的某幾個連續位清零
由於寄存器中有時會有連續幾個寄存器位用於控制某個功能,現假設我們需要把寄存
器的某幾個連續位清零,且其它位不變,方法見代碼
 對某幾個連續位清零

//若把 a 中的二進制位分成 2 個一組
//bit0bit1 為第 0 組, bit2bit3 為第 1 組,
// bit4bit5 為第 2 組, bit6bit7 為第 3

//要對第 1 組的 bit2bit3 清零

a &= ~(3<<2*1);

//括號中的 3 左移兩位, (3<<2*1)得二進制數: 0000 1100 b
//按位取反, ~(3<<2*1)1111 0011 b
//假如 a 中原來的值為二進制數: a = 1001 1111 b
//所得的數與 a 位與&”運算, a = (1001 1111 b)&(1111 0011 b),
//經過運算后, a 的值 a=1001 0011 b
// a 的第 1 組的 bit2bit3 被清零,而其它位不變。

//上述(~(3<<2*1))中的(1)即為組編號;如清零第 3 bit6bit7 此處應為 3
//括號中的(2)為每組的位數,每組有 2 個二進制位;若分成 4 個一組,此處即為 4
//括號中的(3)是組內所有位都為 1 時的值;若分成 4 個一組,此處即為二進制數“1111 b”

//要對第 2 bit4bit5 清零
a &= ~(3<<2*2);


3. 對變量的某幾位進行賦值。
寄存器位經過上面的清零操作后,接下來就可以方便地對某幾位寫入所需要的數值了,
且其它位不變,方法見代碼清單 5-3,這時候寫入的數值一般就是需要設置寄存器的位參
數。
代碼清單 5-3 對某幾位進行賦值
//a = 1000 0011 b
//此時對清零后的第 2 bit4bit5 設置成二進制數“01 b ”

a |= (1<<2*2);
//a = 1001 0011 b,成功設置了第 2 組的值,其它組不變


4. 對變量的某位取反
某些情況下,我們需要對寄存器的某個位進行取反操作,即 1 0 0 1,這可以直
接用如下操作,其它位不變,見代碼清單 5-4
代碼清單 5-4 對某位進行取反操作
//a = 1001 0011 b
//bit6 取反,其它位不變

a ^=(1<<6);
//a = 1101 0011 b

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM