位操作的细节
一、位操作符
(1)位與&
- 位與符號是一個&,兩個&&是邏輯與。
- 位與時兩個操作數是按照二進制位彼次對應位相與的,邏輯與是兩個操作數作為整體來相與的。(舉例:0xAA&0xF0=0xA0, 0xAA && 0xF0=1)
(2)位或|
- 位或符號是一個|,兩個||是邏輯或。
- 位或時兩個操作數是按照二進制位彼次對應位相與的,邏輯或是兩個操作數作為整體來相或的。
(3)位取反~
- C語言中位取反是~,C語言中的邏輯取反是!;
- 按位取反是將操作數的二進制位逐個按位取反,而邏輯取反是真(在C語言中只要不是0的任何數都是真)變成假(在C語言中只有0表示假)、假變成真。
(4)位異或^
(5)左移位<<,右移位>>
- C語言的移位要取決于數據類型。
- 對于無符號數,左移時右側補0(相當于邏輯移位),右移時左側補0(相當于邏輯移位)。
- 對于有符號數,左移時右側補0(叫算術移位,相當于邏輯移位),右移時左側補符號位(如果正數就補0,負數就補1,叫算術移位)。
- 嵌入式中研究的移位,以及使用的移位都是無符號數。
二、位操作在操作寄存器時的特殊作用
1、寄存器操作的要求:特定位改變而不影響其他位
- ARM是內存與IO統一編址的,ARM中有很多內部外設,SoC中CPU通過向這些內部外設的寄存器寫入一些特定的值來操控這個內部外設,進而操控硬件動作。
- 寄存器的特點是按位進行規劃和使用,但是寄存器的讀寫卻是整體32位一起進行的(也就是說你只想修改bit5~bit7是不行的,必須整體32bit全部寫入)。
- 寄存器操作要求是在設定特定位時不能影響其他位。
- 讀-改-寫三部曲。當想改變一個寄存器中某些特定位時,先讀出寄存器整體原來的值,然后修改特定位,再將修改后的值整體寫入寄存器。。
2、特定位清零用&
3、特定位置1用|
4、特定位取反用^
- (任何數,其實就是1或者0)與1位異或會取反,與0位異或無變化。
- 要取反的特定位為1,其他位為0,然后將這個數與原來的數進行位異或即可。
三、使用位操作構建特定的二進制數
- 如果要的這個數比較少位為1,大部分位為0,則可以通過連續很多個1左移n位得到。
- 如果要的數是大部分位為1,則可以通過先構建其位反數,然后再位取反來得到。
- 如果要的數中連續1(連續0)的部分不止1個,那么可以通過多段分別構造,然后再彼此位與即可。
四、使用用宏定義來完成位運算
總結
- 上一篇: android:layout 冒号,an
- 下一篇: 微信小游戏引擎插件,Creator 使用