基本概念
原碼:正數是其二進制本身;負數是符號位為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的負數
-
所有負整數的按位取反是其本身+1的絕對值
-
零的按位取反是 -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。