C語言位操作之二

1、寄存器操作

(1)ARM是內存與IO統一編址的,ARM中有很多內部外設,SoC中CPU通過向這些了內部

外設的寄存器寫入一些特定的值來操控這個內部外設,進而操控硬件動作。所以讀寫寄存器

就是操控硬件。

(2)寄存器的特點是按位進行規劃和使用。但是寄存器的讀寫是整體進行的,只想修改其中 

的幾位是不可以的,必須整體寫入。

(3)寄存器操作的要求:在設定特定位的時候不能影響其他位。

(4)寄存器的操作過程:讀-改-寫。當需要改變一個寄存器中某些特定位時,先讀出寄存器

中原來的值,在這個基礎上修改特定位,再將修改後的值整體寫入寄存器。

2、特定位清零用位與

如果要將寄存器的某些特定位變爲0,則需要構造一個由1和0組成的數和這個寄存器原來的

值進行位與操作。

3、特定位置1用位或

如果要將寄存器的某些特定位變爲1,則需要構造這樣一個數:要置1的特定位爲1,其他位

爲0,讓後將這個數與原來的數進行位或即可。

4、特定位取反

需要構造這樣一個數:要取反的特定位爲1,其他位爲0,讓後將這個數與原來的數進行

位異或即可。

 5、獲取特定位爲1的二進制數

(1)用移位來操作,例如我們需要構建一個bit3~bit7爲1的二進制數(其他位爲0),

我們只需要將5個1左移三位,(0x1f<<3)

(2)構建一個bit3~bit7爲1,同時bit23~bit25爲1爲1,其餘位爲0的數:((0x1f<<3)|(0x7<<23))

6、獲取特定位爲0的二進制數

(1)獲取bit4~bit10爲0,其餘位爲1的二進制數:(0xf<<0)|(0x1fffff<<11)

(2)當特定位比較少的情況(如上所示),不適合用連讀左移1來構造,可以先構造出

這個數的相反數,再取反得到這個數。還是(1)中的例子:~(0x7f<<4)

綜上:

如果要構造的數中爲1的位比較少,大部分爲0,則可以通過連續多個1左移得到。

如果要構造的數中爲0的位比較少,大部分爲1,則可以通過先構造相反數,再取反得到。

 

 

 

 

 

 

 

 

發佈了16 篇原創文章 · 獲贊 0 · 訪問量 4879
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章