C語言位運算符詳解


基本概念

原碼:正數是其二進制本身;負數是符號位為1,數值部分取X絕對值的二進制

  • 例如:3的原碼為 0000 0011;-3的原碼為1000 0011

反碼:正數的反碼是其本身,對於負數其符號位不變其它各位取反(0變1,1變0)。

  • 例如:3的反碼為 0000 0011;-3的反碼為1111 1100

補碼:正數的補碼是其本身,負數的補碼是其反碼的基礎上+1。

  • 例如:3的補碼為 0000 0011;-3的補碼為1111 1101

正數的補碼、反碼都是其本身

要弄懂位運算符的計算方法,首先必須明白二進制數在內存中的存放形式,二進制數在內存中是以補碼的形式存放的。


按位與&

參與運算的兩個值,轉換成2進制,如果兩個相應位均為1時,結果位才為1,否則為0.

例如:8&3,轉換成2進制:00001000(8的二進制) & 00000011(3的二進制) 00000000(結果為0)

7 & 3,轉換成2進制:00000111(7的二進制) & 00000011(3的二進制) 00000011(結果為3)

-7 & 3,轉換成2進制:1000 0111(-7的二進制) & 0000 0011(3的二進制),轉換成補碼形式1111 1001(-7的補碼) & 0000 0011(3的補碼), 結果為0000 0001(結果為1)

-7 & -3,轉換成2進制:1000 0111(-7的二進制) & 1000 0011(-3的二進制),轉換成補碼形式1111 1001(-7的補碼) & 1111 1101(-3的補碼), 結果為1111 1001 這是補碼還要轉換成原碼,轉換后為 1000 0111(結果為-7)


按位或 |

參與運算的兩個值,轉換成二進制,如果兩個數的相應位有1,結果位就為1。

例如:8&3,轉換成2進制:00001000(8的二進制) | 00000011(3的二進制) 00001011(結果為11)

7 & 3,轉換成2進制:00000111(7的二進制) | 00000011(3的二進制) 00000111(結果為7)

-7 & 3,轉換成2進制:1000 0111(-7的二進制) | 0000 0011(3的二進制),轉換成補碼形式1111 1001(-7的補碼) | 0000 0011(3的補碼), 結果為1111 1011這是補碼,轉換成原碼為1000 0101(結果為-5)

-7 & -3,轉換成2進制:1000 0111(-7的二進制) | 1000 0011(-3的二進制),轉換成補碼形式1111 1001(-7的補碼) | 1111 1101(-3的補碼), 結果為1111 1101這是補碼,轉換成原碼為1000 0011(結果為-3)


按位異或 ^

參與運算的兩個值,轉換成二進制,如果兩個數的相應為相同,為0,否則為1.

例如:8&3,轉換成2進制:00001000(8的二進制) ^ 00000011(3的二進制) 00001011(結果為11)

7 & 3,轉換成2進制:00000111(7的二進制) ^ 00000011(3的二進制) 00000100(結果為4)

-7 & 3,轉換成2進制:1000 0111(-7的二進制) ^ 0000 0011(3的二進制),轉換成補碼形式1111 1001(-7的補碼) ^ 0000 0011(3的補碼), 結果為1111 1010這是補碼,轉換成原碼為1000 0110(結果為-6)

-7 & -3,轉換成2進制:1000 0111(-7的二進制) ^ 1000 0011(-3的二進制),轉換成補碼形式1111 1001(-7的補碼) ^ 1111 1101(-3的補碼), 計算結果為0000 0100,十進制為 4


按位取反運算符 ~

取反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。

例如:~7,轉換成2進制:0000 0111(7的二進制)[原],求補碼0000 0111 [補],對補碼取反,包括符號位1111 1000,最后補碼轉原碼1111 0111 [反碼],1000 1000 [原碼]

計算步驟:

  1. 先對正數求補碼
  2. 然后對補碼取反,包括符號位
  3. 最后進行一個補碼求原碼的過程

快速計算小技巧:

  1. 所有正整數的按位取反是其本身+1的負數

  2. 所有負整數的按位取反是其本身+1的絕對值

  3. 零的按位取反是 -1(0在數學界既不是正數也不是負數)


左移(<<)、右移(>>)運算符

左移運算符和右移運算符都是雙目運算符。

左移運算:其功能是將運算符‘<<’左邊的操作數的各二進制位全部左移指定的位數。左移時,操作數移出左邊界的位被屏蔽,從右邊開始用0填補空位,其表達式的一般形式為:(操作數) << (移位位數)

例如:13 << 3, 將操作數轉換成二進制0000 1101,左移3位0110 1000,十進制就是104。

15<<2, 將操作數轉換成二進制0000 1111,左移2位0011 1100,十進制就是60。

計算技巧: (操作數) x 2移位位數 ,例如:13 x 23 = 104, 15 x 22 =60。

右移運算:其功能是將運算符‘>>’ 左邊的操作數的各二進制位全部右移指定的位數。

右移時,操作數移出右邊的位被屏蔽,從左邊開始用符號位填補空位。如果原先最高位是1,則填補1;如果是0,則填補0,其表達式的一般形式為:(操作數) >> (移位位數)

例如:16 >> 3, 將操作數轉換成二進制0001 0000,右移3位0000 0010,十進制就是2。

15>>2, 將操作數轉換成二進制0000 1111,右移2位0000 0011,十進制就是3。

-15>>2, 將操作數轉換成二進制1000 1111,轉換成補碼 1111 0001,右移2位1111 1100,轉換成原碼1000 0100十進制就是-4。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM