2 1 C語言之位操作符

2021-08-15 21:28:12 字數 2552 閱讀 4722

c語言中,位操作一共有6個位操作符,分別是位與&(and),位或|(or),位取反~(一元運算子),位異或^(xor),左移位<<,右移位》。

2.1.1位與&

(1)位與操作符&,邏輯與操作符&&,兩者不同。位與是按位進行與操作,只有0或者1這兩個運算元;邏輯與運算元是只要不是0的,都為1,邏輯與是兩個運算元作為整體來相與的。

(2)真值表:

運算元a

運算元b

a&b000

0101

0011

1(3)規律總結:遇0為0,遇1不變。

(4)舉例:兩個運算元a:0x12356705,b:0xaaaabbcc,a&b?a&&b?

a:0x12356705=10010001101010110011100000101;

b:0xaaaabbcc=10101010101010101011101111001100

00010010001101010110011100000101

& 10101010101010101011101111001100

00000010001000000010001100000100

故a&b=00000010001000000010001100000100

a&&b=0x12356705&&0xaaaabbcc=1&&1=1。

2.1.2位或|

(1)位或操作符只有乙個|,即操作符為|;邏輯或操作符有兩個|,即操作符為||。位或是按位進行或操作,只有0或者1這兩個運算元;邏輯或運算元是只要不是0的,都為1。

(2)真值表

運算元a

運算元b

a|b000

0111

0111

1(3)規律總結:遇0不變,遇1為1。

(4)舉例:兩個運算元,a:0x12345678,b:0x15141251;a|b?a||b?

a:0x12345678=10010001101000101011001111000

b:0x15141251=10101000101000001001001010001

10010001101000101011001111000

|10101000101000001001001010001

10111001101000101011001111001

故a|b=10111001101000101011001111001;

而a||b=0x12345678||0x15141251=1||1=1。

2.1.3位取反~(一元運算子)

(1)按位取反操作符為~,邏輯取反操作符為!。按位取反是按位逐位取反,即0按位取反變成1,1按位取反變成0。而邏輯取反則只要不是0的按邏輯取反都變成0,而0按邏輯取反變成1。

(2)真值表

運算元a~a0

110(3)舉例:運算元a:0x12579233,~a?,!a?,~~a?,!!a?

a=0x12579233=00010010010101111001001000110011

故:~ a=11101101101010000110110111001100

!a=!1=0

~~a=00010010010101111001001000110011=a

!!a=!0=1≠a

由以上有趣現象,我們可以總結為:任何非0的數被按邏輯取反再取反就會得到1;任何非0的數倍按位取反再取反就會得到他自己。

2.1.4位異或^

(1)位異或的操作符為^。

(2)真值表

運算元a

運算元b

a^b000

0111

0111

0(3)規律總結:遇0不變,遇1相反。記憶:異或就是當兩個運算元相異時進行或操作。

(4)舉例:兩個運算元a:0x12345665,b:0x55662331,a^b?

a=0x12345665=00010010001101000101011001100101

b=0x55662331=01010101011001100010001100110001

00010010001101000101011001100101

^01010101011001100010001100110001

01000111010100100111010101010100

故a^b=01000111010100100111010101010100。

位與、位或、位異或的特點總結:

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

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

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

2.1.5左移位《與右移位

在c語言中,移位操作要取決於資料結構。

(1)    在無符號數中,左移時右側補0(相當於邏輯移位)。

(2)    在無符號數中,右移時左側補0(相當於邏輯移位)。

(3)    在有符號數中,左移時右側補零(叫算術移位,相當於邏輯移位)。

(4)    在有符號數中,右移時左側補符號位(如果正數就補0,負數就補1,叫做算術移位)。

嵌入式中研究的移位,我們使用的移位都是無符號數!

21 C語言 位域

如果程式的結構中包含多個開關量,只有 true false 變數,如下 struct status 這種結構需要 8 位元組的記憶體空間,但在實際上,在每個變數中,我們只儲存 0 或 1。在這種情況下,c 語言提供了一種更好的利用記憶體空間的方式。如果您在結構內使用這樣的變數,您可以定義變數的寬度來...

c語言之操作符

c語言的操作符主要有8種 算數操作符,移位操作符,位操作符,賦值操作符,單目操作符,關係操作符,邏輯操作符,條件操作符。1 算數操作符 主要有 可以作用於整數和浮點數,而 只能作用於整數,返回的是整除之後的餘數。2 移位操作符 主要有左移 右移 左移規則 左邊拋棄,右邊補零,有乘2的效果 右移規則 ...

c語言操作符 位操作符 移位操作符

1 按位操作符 1.1 按位 與 雙目運算子 僅當兩個運算元都為1時,結果為1,否則為0。參與運算的數以補碼方式出現。例 9 5 1 0000 1001 9的補碼 0000 0101 5的補碼 0000 0001 1的補碼 應用 a 通常將某些位清零或保留某些位。例如 將a的高八位清零,保留低八位,...