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的高八位清零,保留低八位,...