C語言基礎一 位運算

2021-08-10 20:25:03 字數 2847 閱讀 4626

程式是按照從上到下的順序依次執行的。

選擇結構,程式中會判斷並選擇一條符合條件的語句執行。

if(條件表示式)

執行的語句:

else

if(條件表示式)

執行的語句;

else

執行的語句;

switch(表示式) //不能為小數,因為計算機中的小數只能儲存近似值。

break;是跳出這個選擇結構,若是沒有break,就繼續按順序結構執行下面的語句。

for、while、do while。

for(初始條件(賦值表示式); 條件表示式(終止條件); 步長(迴圈增量))

{ 迴圈體;

} 多條語句必須加花括號。

執行順序:初, 條, 體, 步。

while(條件表示式)

{ 迴圈體;

} 執行順序:先判斷條表,再執行迴圈體。

do{

迴圈體;

}while(條件表示式)

執行順序: 先執行迴圈體,在判斷條件表示式。

&,|,^,~。

<<,>>。

真值表:

1 & 1 = 1

0 & 1 = 0

1 & 0 = 0

0 & 0 = 0

注意:位與是&,&&是邏輯與。

真值表:

1 | 1 = 1

0 | 1 = 1

1 | 0 = 1

0 | 0 = 0

注意:位或是 |,|| 是邏輯或。

真值表:

1 ^ 1 = 0

0 ^ 1 = 1

0 ^ 0 = 0

1 ^ 0 = 1

相同的值異或為0,不同的值異或為1。

將運算元按照二進位制位按位取反(1變成0,0變成1)

注意:按位取反是~,邏輯取反是!

(0或者1) & 0 = 0, (0或者1) & 1 = 其本身;

(0或者1) | 0 = 其本身, (0或者1) | 1 = 1;

(0或者1) ^ 0 = 其本身, (0或者1) ^ 1 = (1或者0,相當於取反);

c語言的移位要取決於資料型別,與資料在記憶體中的儲存形式有關。

對於無符號數:

左移《時,右側補0(相當於邏輯移位)

右移》時,左側補0(相當於邏輯移位)

僅對於無符號數操作,左移動n位,是乘以2的n次方;右移n位,是除以2的n次方

對於有符號數:

左移《時,右側補0(算術移位,相當於邏輯移位,符號位會丟失)

右移》時,左側補符號位(算術移位,如果正數就補0,負數就補1)

嵌入式中研究、使用的移位都是無符號數。

按位與,按位或,按位異或在操作暫存器時的特殊作用

(1)arm是記憶體與io統一編址的,arm中有很多內部外設,soc中cpu通過向這些內部外設的暫存器寫入一些特定的值來操控這個內部外設,進而操控硬體動作。所以可以說:讀寫暫存器就是操控硬體。

(2)暫存器的特點是按位進行規劃和使用。但是暫存器的讀寫卻是整體32位一起進行的(也就是說你只想修改bit5~bit7是不行的,必須整體32bit全部寫入)

(3)暫存器操作要求就是:在設定特定位時不能影響其他位。

(4)如何做到?答案是:讀-改-寫三部曲。讀改寫的操作理念,就是:當我想改變乙個暫存器中某些特定位時,我不會直接去給他寫,我會先讀出暫存器整體原來的值,然後在這個基礎上修改我想要修改的特定位,再將修改後的值整體寫入暫存器。這樣達到的效果是:在不影響其他位原來值的情況下,我關心的位的值已經被修改了。

(任何數,其實就是1或者0)與1按位與時無變化,與0按位與時變成0。

假設原來32位暫存器中的值為:0xaa aa aa aa,要將bit8~bit15清零,可以將這個數與0xff ff 00 ff按位與,

結果為0xaa aa 00 aa。

(任何數,其實就是1或者0)與1按位或變成1,與0按位或無變化。

假設原來32位暫存器中的值為:0xaa a0 00 0a,要將bit8~bit15置1,可以將這個數與0x00 00 ff 00按位或。

結果為0xaa a0 ff 0a。

(任何數,其實就是1或者0)與1位異或會取反,與0位異或無變化。

假設原來32位暫存器中的值為:0xaa aa aa aa,要將bit16~bit23置1,可以將這個數與0x00 ff 00 00按位異或。

結果為0xaa 55 aa aa。

暫存器位操作經常需要特定位給特定值

解法1:直接給出完整的32位特定數。

優勢:可以完成工作,難度也不大,操作起來也不是太麻煩。

劣勢:依賴工具,而且不直觀,讀程式的人不容易理解。

評價:凑活能用,但是不好用,應該被更好用的方法替代。

解法2:自己寫**用位操作符號(主要是移位和位取反)來構建這個特定的二進位制數

使用移位獲取特定位為1,其他位為0的二進位制數

如我們需要乙個bit3~bit7為1(隱含意思就是其他位全部為0)的二進位制數,可以這樣:(0x1f << 3)

獲取bit3~bit7為1,同時bit23~bit25為1,其餘位為0的數:((0x1f << 3) | (7 << 23))

結合位取反獲取特定位為0,其他位為0的二進位制數

因為移位時是補0的,所以

要獲取bit4~bit10為0,其餘位全部為1的數,用左移加按位取反的方式來構造比較簡單。

首先將構造特定位為1,其他位為0的數,再取反。

如果想要改變的特定位不止一處,那麼可以多段分別構造,然後再按位或,這時候的按位或相當於幾個數相加。

因為參與位或運算的各個數為1的位是不重複的。

C語言基礎 位運算

start reading 作為乙個c語言的小白,位運算的重要性還不能深深地感受,不過等到以後接觸了linux,實行大小端轉換 就要運用到很多位運算,所以,位運算是非常重要的!位運算實際上就是二進位制的計算,下面我來介紹一下位運算的相關知識 按位取反 10 0000 1010 10 1111 010...

CSAPP 實驗一 位運算

課程鏈結如下 coursera hardware software inte ce 這門課的大部分內容是對應於書 深入理解計算機系統 該書的英文名稱是 computer systems a programmer s perspective 該書講解了計算機的底層知識,其中大部分我認為是乙個合格程式設...

c語言位運算

c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 按位或 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1 取反 是一元運算子,用來對乙個二進位制數按位取反,即將0變1...