在計算機內,有符號數有3種表示法: 原碼,反碼,和補碼.所有數據的運算都是採用補碼進行的.
原碼 就是二進制定點表示法,即最高位爲符號位,”0”表示正,”1”表示負,其位表示數值的大小.
反碼 正數的反碼與其原碼相同,負數的反碼是對其原碼逐位取反,但符號位除外.
補碼 正數的補碼與其原碼相同,負數的補碼是在其反碼的末位加1.
更好的理解,用原碼,反碼,補碼來分別表示+6和-6
原碼 正數的原碼最高位是 0,負數的原碼最高位是 1 ,
其位表示數值的大小.
符號位 數值位
+6 0 0000110
- 6 1 0000110
反碼 正數的反碼與原碼相同'
負數的反碼與原碼符號位相同,數值位取反(就是1變0,0變1).
符號位 數值位
+6 0 0000110
- 6 1 1111001
補碼 正數的反碼與原碼相同.
負數的補碼是在反碼的基礎上加1.
符號位 數值位
+6 0 0000110
- 6 1 1111010
位運算符 & , | , ^ , ~
int a = 6; int b = 3; 求 a&b ,a|b , a^b , ~6;
6的二進制: 110
原碼: 00000000 00000000 00000000 00000110
3的二進制: 11
原碼: 00000000 00000000 00000000 00000011
用6和3的補碼運算得到: &: 位與運算 (有0則0)
6&3: 00000000 00000000 00000000 00000010 //2
| : 位或運算(有1則1)
6|3 : 00000000 00000000 00000000 00000111 //7
^ : 位異或運算(相同則0,不同則1)
6^3: 00000000 00000000 00000000 00000101 //5
~:按位取反運算符(0變1,1變0)
~6 : 11111111 11111111 11111111 11111001 (補碼)
11111111 11111111 11111111 11111000 (反碼)
00000000 00000000 00000000 00000111 (原碼) //-7
位移運算符 << 左移 ,左邊最高位丟棄,右邊補齊0,
>> 右移,最高位是0,左邊補齊0;最高位是1,左邊補齊1
>>>無符號右移,無論最高位是0還是1,左邊補齊0
int i = 6; int k =8; 求 i<<1 ,i>>1 , k<<2 , k>>2 ;
6的二進制: 110
原碼: 00000000 00000000 00000000 00000110
8的二進制: 1000
原碼: 00000000 00000000 00000000 00001000
<<左移: 把<<左邊的數據乘以2的移動次冪
6<<1: (0)0000000 00000000 00000000 000001100 //12
8<<2: (00)000000 00000000 00000000 0000100000 //32
>>右移: 把>>左邊的數據除以2的移動次冪
6>>1: 000000000 00000000 00000000 0000011(0) //3
8>>2: 0000000000 00000000 00000000 000010(00) //2
int i = 24; int k = -24; 求 i >>2, k>>2, i>>>2, k>>>2;
24的二進制: 11000
原碼: 00000000 00000000 00000000 00011000
-24的原.反.補碼
原碼: 10000000 00000000 00000000 00011000
反碼: 11111111 11111111 11111111 11100111
補碼: 11111111 11111111 11111111 11101000
24>>2 = 6
-24>>2 : 11111111 11111111 11111111 111010(00) (補碼)
11111111 11111111 11111111 111001 (反碼)
10000000 00000000 00000000 000110 (原碼) // -6