1、位操作符
(1)位與&
(2)位或|
(3)位取反~
(4)位異或^
位與、位或、位異或的特點總結:
位與:(任何數,其實就是1或者0)與1位與無變化,與0位與變成0
位或:(任何數,其實就是1或者0)與1位或變成1,與0位或無變化
位異或:(任何數,其實就是1或者0)與1位異或會取反,與0位異或無變化
2、左移位<< 與右移位》
c語言的移位要取決於資料型別。
對於無符號數,左移時右側補0(相當於邏輯移位)
對於無符號數,右移時左側補0(相當於邏輯移位)
對於有符號數,左移時右側補0(叫算術移位,相當於邏輯移位)
對於有符號數,右移時左側補符號位(如果正數就補0,負數就補1,叫算術移位)
嵌入式中研究的移位,以及使用的移位都是無符號數
3、暫存器操作的要求(特定位改變而不影響其他位)
(1)arm是記憶體與io統一編址的,arm中有很多內部外設,soc中cpu通過向這些內部外設的暫存器寫入一些特定的值來操控這個內部外設,進而操控硬體動作。所以可以說:讀寫暫存器就是操控硬體。
(2)暫存器的特點是按位進行規劃和使用。但是暫存器的讀寫卻是整體32位一起進行的(也就是說你只想修改bit5~bit7是不行的,必須整體32bit全部寫入)
(3)暫存器操作要求就是:在設定特定位時不能影響其他位。
(4)如何做到?答案是:讀-改-寫三部曲。讀改寫的操作理念,就是:當我想改變乙個暫存器中某些特定位時,我不會直接去給他寫,我會先讀出暫存器整體原來的值,然後在這個基礎上修改我想要修改的特定位,再將修改後的值整體寫入暫存器。這樣達到的效果是:在不影響其他位原來值的情況下,我關心的位的值已經被修改了。
4、特定位清零用&
(1)位與操作的特點:(任何數,其實就是1或者0)與1位與無變化,與0位與變成0
(2)如果希望將乙個暫存器的某些特定位變成0而不影響其他位,可以構造乙個合適的1和0組成的數和這個暫存器原來的值進行位與操作,就可以將特定位清零。
(3)舉例:假設原來32位暫存器中的值為:0xaaaaaaaa,我們希望將bit8~bit15清零而其他位不變,可以將這個數與0xffff00ff進行位與即可。
5、特定位置1用 |
(1)位或操作的特點:任何數,其實就是1或者0)與1位或變成1,與0位或無變化
(2)操作手法和剛才講的位與是類似的。我們要構造這樣乙個數:要置1的特定位為1,其他位為0,然後將這個數與原來的數進行位或即可。
6、特定位取反用^
(1)位異或操作的特點:(任何數,其實就是1或者0)與1位異或會取反,與0位異或無變化
(2)操作手法和剛才講的位與是類似的。我們要構造這樣乙個數:要取反的特定位為1,其他位為0,然後將這個數與原來的數進行位異或即可。
7、暫存器位操作經常需要特定位給特定值
(1)從上節可知,對暫存器特定位進行置1或者清0或者取反,關鍵性的難點在於要事先構建乙個特別的數,這個數和原來的值進行位與、位或、位異或等操作,即可達到我們對暫存器操作的要求。
(2)解法1:用工具軟體或者計算器或者自己大腦計算,直接給出完整的32位特定數。
優勢:可以完成工作,難度也不大,操作起來也不是太麻煩。
劣勢:依賴工具,而且不直觀,讀程式的人不容易理解。
評價:凑活能用,但是不好用,應該被更好用的方法替代。
解法2:自己寫**用位操作符號(主要是移位和位取反)來構建這個特定的二進位制數
8、使用移位獲取特定位為1的二進位制數
(1)最簡單的就是用移位來獲取乙個特定位為1的二進位制數。譬如我們需要乙個bit3~bit7為1(隱含意思就是其他位全部為0)的二進位制數,可以這樣:(0x1f<<3)
(2)更難一點的要求:獲取bit3~bit7為1,同時bit23~bit25為1,其餘位為0的數:((0x1f<<3) | (7<<23))
9、再結合位取反獲取特定位為0的二進位制數
(1)這次我們要獲取bit4~bit10為0,其餘位全部為1的數。怎麼做?
(2)利用上面講的方法就可以:(0xf<<4)|(0x1fffff<<11)
但是問題是:連續為1的位數太多了,這個數字本身就很難構造,所以這種方法的優勢損失掉了。
(3)這種特定位(比較少)為0而其餘位(大部分)為1的數,不適合用很多個連續1左移的方式來構造,適合左移加位取反的方式來構造。
(2)思路是:先試圖構造出這個數的位相反數,再取反得到這個數。(譬如本例中要構造的數bit4~bit10為0其餘位為1,那我們就先構造乙個bit4~bit10為1,其餘位為0的數,然後對這個數按位取反即可)
10、總結:位與、位或結合特定二進位制數即可完成暫存器位操作需求
(1)如果你要的這個數比較少位為1,大部分位為0,則可以通過連續很多個1左移n位得到。
(2)如果你想要的數是比較少位為0,大部分位為1,則可以通過先構建其位反數,然後再位取反來得到。
(3)如果你想要的數中連續1(連續0)的部分不止1個,那麼可以通過多段分別構造,然後再彼此位與即可。這時候因為參與位或運算的各個數為1的位是不重複的,所以這時候的位或其實相當於幾個數的疊加。
2 C語言位操作
常用位操作 在這裡插入描述 位異或 兩位都相等,結果為0,不相等則為1 左移位 將乙個運算元的各二進位制全部左移若干位,左邊移除出去的二進位制位丟棄,右邊的二進位制位補0。每進行一次左移位操作,得到的結果是原來運算元的一倍 x n x 2 n 位操作與暫存器 暫存器的操作 1 暫存器特定位的清零用 ...
C語言篇(2)C語言關鍵字
這些關鍵字不能作為常量名 變數名或者函式名等識別符號 關鍵字含義 int申明整形變數或函式 short 修飾int,申明短整型變數或函式 long 修飾int,申明長整型變數或函式 longlong 修飾int,超長整形資料 signed 修飾整形資料,有符號資料型別 unsigned 修飾整形資料...
2 c練習 位操作
include define debug debug時需要開啟 ifndef debug define deb format,while 0 endif ifdef debug define deb format,printf format,va args endif define set nth ...