計算機對有符號數(包括浮點數)的表示有三種方法:原碼、反碼和補碼,補碼=反碼+1。在二進制里,是用 0 和 1 來表示正負的,最高位為符號位,最高位為 1 代表負數,最高位為 0 代表正數。
在 Java 中聲明兩個 int 類型的變量:
int a = 9;
int b = -9;
那么 a 在計算機中的二進制形式則是:
0000 0000 0000 0000 0000 0000 0000 1001
b 在計算機中的二進制形式則是:
1111 1111 1111 1111 1111 1111 1111 0111
Java 查看 int 類型二進制形式的方法:Integer.toBinaryString( -9 )
Java int 類型的長度是32,所以 a 和 b 的長度都是 32 位
正數的二進制轉換規則:
將正的十進制數除以二,得到的商再除以二,依次類推直到商為零或一時為止,然后在旁邊標出各步的余數,最后倒著寫出來,高位補零
計算42的二進制數
那么 42 的二進制形式就是 101010
負數的二進制轉換規則:
1. 先將 -9 的絕對值轉為二進制:
0000 0000 0000 0000 0000 0000 0000 1001
2. 將該二進制反碼:
1111 1111 1111 1111 1111 1111 1111 0110
3. 將反碼后的值加1:
1111 1111 1111 1111 1111 1111 1111 0111
下面就以 a 和 b 變量為例來進行運算:
位運算符
左移運算符 <<
a << 2
1. 將
????0000 0000 0000 0000 0000 0000 0000 1001 進行左移兩位,低位補 0
2. 結果為:0000 0000 0000 0000 0000 0000 0010 0100 = 36
b << 2
1. b 是負數,先將 b(-9)的絕對值轉為二進制:
?????????????0000 0000 0000 0000 0000 0000 0000 1001
2. 反碼: 1111 1111 1111 1111 1111 1111 1111 0110
3. 再將反碼后的值加 1:1111 1111 1111 1111 1111 1111 1111 0111
4. 進行左移兩位,低位補零
5. 結果為:1111 1111 1111 1111 1111 1111 1101 1100(-36的二進制格式)
“有符號”右移位運算符 >>(保留最高位符號位)
a >> 2
1. 將
????0000 0000 0000 0000 0000 0000 0000 1001 進行右移兩位,高位補 0
2. 結果為:0000 0000 0000 0000 0000 0000 0000 0010 = 2
b >> 2
1. b 是負數,先將 b(-9)的絕對值轉為二進制:
?????????????0000 0000 0000 0000 0000 0000 0000 1001
2. 反碼: 1111 1111 1111 1111 1111 1111 1111 0110
3. 再將反碼后的值加 1:1111 1111 1111 1111 1111 1111 1111 0111
4. 進行右移兩位,高位補一
5. 結果為:1111 1111 1111 1111 1111 1111 1111 1101(-3的二進制格式)
“無符號”右移位運算符 >>>(不保留最高位符號位,最高位始終補 0)
a >>> 2
1. 將
????0000 0000 0000 0000 0000 0000 0000 1001 進行右移兩位,高位補 0
2. 結果為:0000 0000 0000 0000 0000 0000 0000 0010 = 2
b >>> 2
1. b 是負數,先將 b(-9)的絕對值轉為二進制:
?????????????0000 0000 0000 0000 0000 0000 0000 1001
2. 反碼: 1111 1111 1111 1111 1111 1111 1111 0110
3. 再將反碼后的值加 1:1111 1111 1111 1111 1111 1111 1111 0111
4. 進行右移兩位,高位補零
5. 結果為:0011 1111 1111 1111 1111 1111 1111 1101 = 1073741821
按位與 &
9 & 11
參與運算的兩個數的二進制值按位比較,只有兩個操作數對應位同為 1 時,結果為 1,其余全為 0
9 的二進制數為: 0000 0000 0000 0000 0000 0000 0000 1001
11 的二進制數為:0000 0000 0000 0000 0000 0000 0000 1011
???運算結果為:
0000 0000 0000 0000 0000 0000 0000 1001 = 9
按位或 |
9 | 11
參與運算的兩個數的二進制值按位比較,只有兩個操作數對應位同為 0 時,結果為 0,其余全為 1
9 的二進制數為: 0000 0000 0000 0000 0000 0000 0000 1001
11 的二進制數為:0000 0000 0000 0000 0000 0000 0000 1011
???運算結果為:
0000 0000 0000 0000 0000 0000 0000 1011 = 11
按位非 ~
~11
11 的二進制數為:0000 0000 0000 0000 0000 0000 0000 1011
?????把每一位全部取反
?????運算結果為:
?1111 1111 1111 1111 1111 1111 1111 0100(-12的二進制格式)
按位異或運算符 ^
9 ^ 2
參與運算的兩個數的二進制值按位比較,如果兩個相應位相同,則結果為 0,否則為 1
9 的二進制數為:0000 0000 0000 0000 0000 0000 0000 1001
2 的二進制數為:0000 0000 0000 0000 0000 0000 0000 0010
???運算結果為:
0000 0000 0000 0000 0000 0000 0000 1011 = 11