使用C語言對寄存器賦值時,常常需要用到C語言的位操作方法。把寄存器某位清零假設(shè)a代表寄存器,且其中本來已有值。如果要把其中某一位清零且其它位不變,代碼如下。
//定義一個變量 a = 1001 1111 b (二進制數(shù))unsigned char a = 0x9f;//對 bit2 清零a &= ~(1<<2);//括號中的 1 左移兩位,(1<<2) 得二進制數(shù):0000 0100 b//按位取反,~(1<<2) 得 1111 1011 b//假如 a 中原來的值為二進制數(shù):a = 1001 1111 b//所得的數(shù)與 a 作”位與&”運算,a = (1001 1111 b)&(1111 1011 b),//經(jīng)過運算后,a 的值 a=1001 1011 b// a 的 bit2 位被被零,而其它位不變。把寄存器某幾個連續(xù)位清零????由于寄存器中有時會有連續(xù)幾個寄存器位用于控制某個功能,現(xiàn)假設(shè)我們需要把寄存器的某幾個連續(xù)位清零,且其它位不變,代碼如下。
//若把 a 中的二進制位分成 2 個一組//即 bit0、bit1 為第 0 組,bit2、bit3 為第 1 組,// bit4、bit5 為第 2 組,bit6、bit7 為第 3 組//要對第 1 組的 bit2、bit3 清零a &= ~(3<<2*1);//括號中的 3 左移兩位,(3<<2*1) 得二進制數(shù):0000 1100 b//按位取反,~(3<<2*1) 得 1111 0011 b//假如 a 中原來的值為二進制數(shù):a = 1001 1111 b//所得的數(shù)與 a 作”位與&”運算,a = (1001 1111 b)&(1111 0011 b),//經(jīng)過運算后,a 的值 a=1001 0011 b// a 的第 1 組的 bit2、bit3 被清零,而其它位不變。//上述 (~(3<<2*1)) 中的 (1) 即為組編號; 如清零第 3 組 bit6、bit7 此處應(yīng)為 3//括號中的 (2) 為每組的位數(shù),每組有 2 個二進制位; 若分成 4 個一組,此處即為 4//括號中的 (3) 是組內(nèi)所有位都為 1 時的值; 若分成 4 個一組,此處即為二進制數(shù)“1111 b”//例如對第 2 組 bit4、bit5 清零a &= ~(3<<2*2);對寄存器某幾位賦值????寄存器位經(jīng)過清零操作后就可以方便地對某幾位寫入所需要的數(shù)值了,具體代碼如下。
//a = 1000 0011 b//此時對清零后的第2組bit4、bit5設(shè)置成二進制數(shù)“01b”a|=(1<<2*2);//a = 1001 0011 b,成功設(shè)置了第 2 組的值,其它組不變寄存器某位取反????要對寄存器的某個位進行取反操作,即 1 變 0 ,0 變 1,這可以直接用如下操作。
//a = 1001 0011 b//把 bit6 取反,其它位不變 a ^=(1<<6);//a = 1101 0011 b
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120384 -
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136860
原文標(biāo)題:C語言操作寄存器的常見手法
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論