位運算
一、原碼,反碼,補碼
-
(1) 二進制的最高位是符號位:0 表示正數,1 表示負數(怎么記?
1
旋轉一下變成-
) -
(2) 正數的原碼、反碼、補碼都一樣(三碼合一)
-
(3) 負數的反碼=它的原碼符號位不變,其他位取反(0 - > 1 , 1 - > 0)
-
(4) 負數的補碼=負數的反碼+1,負數的反碼=負數的補碼 - 1
-
(5) 0 的反碼,補碼都是 0
-
(6) java 沒有無符號數,換言之,java 中的數字都是有符號的
-
(7) (很重要!!!)在計算機運算的時候,都是以補碼的方式來運算的
-
(8) (重點!!!)當我們看運算結果的時候,要看它的原碼
二、位運算
1. 位運算符
2. 運算規則
-
注意:先將左右操作數轉換成二進制,計算過程是采用補碼計算
-
按位
&
:兩位全為 1,結果為 1,否則為 0 -
按位或
|
:兩位有一個為 1,結果為 1,否則為 0 -
按位異或
^
:兩位一個為 0,一個為 1,結果為 1,否則為 0 -
按位取反
~
:0 - > 1 , 1 - > 0 -
算術右移2 位
>>
:低位溢出(指的是保存十進制數值所需要的二進制位數),符號位不變,并用符號位補溢出的高位-
int a=1>>2
: // 1 => 00000001 => 00000000 (標黃的就是溢出的位) -
本質 :1 / 2 / 2 = 0
-
速算結果:左操作數作為被除數,右操作數表示除于二的次數,結果即為操作結果值
-
-
算術左移2 位
<<
:符號位不變,低位左移(指的是保存十進制數值所需要的二進制位數),低位補 0-
int c=1<<2;
// 1 => 00000001 => 00000100 -
本質:1 _ 2 _ 2 = 4
-
速算結果:左操作數作為乘數,右操作數表示乘以二的次數,結果即為操作結果值
-
-
邏輯右移
>>>
:符號位也無符號右移,運算規則是:低位溢出,高位補 0 -
特別說明:沒有
<<<
符號
三、運算方法代碼示例
說明:由于數據類型是
int
類型,所有采用四個字節大小
// 位運算
public class BitOperator {// 編寫一個main方法public static void main(String[] args) {// 推導過程// 1. 先得到 2的補碼 => 2的原碼 00000000 00000000 00000000 00000010// 2的補碼 00000000 00000000 00000000 00000010// 2. 3的補碼 3的原碼 00000000 00000000 00000000 00000011// 3的補碼 00000000 00000000 00000000 00000011// 3. 按位&// 00000000 00000000 00000000 00000010// 00000000 00000000 00000000 00000011// 00000000 00000000 00000000 00000010 & 運算后的補碼// 運算后的原碼 也是 00000000 00000000 00000000 00000010// 結果就是 2System.out.println(2 & 3); // 2// 推導// 1. 先得到 -2的原碼 10000000 00000000 00000000 00000010// 2. -2的 反碼 11111111 11111111 11111111 11111101// 3. -2的 補碼 11111111 11111111 11111111 11111110// 4. ~-2操作 00000000 00000000 00000000 00000001 運算后的補碼// 5. 運算后的原碼 就是 00000000 00000000 00000000 00000001 => 1System.out.println(~-2); // 1// 推導// 1. 得到2的補碼 00000000 00000000 00000000 00000010// 2. ~2操作 11111111 11111111 11111111 11111101 運算后的補碼// 3. 運算后的反碼 11111111 11111111 11111111 11111100// 4. 運算后的原碼 10000000 00000000 00000000 00000011 => -3System.out.println(~2); // -3System.out.println(1 >> 2); // 0System.out.println(1 << 2); // 4System.out.println(4 << 3); // 4 * 2 * 2 * 2 = 32System.out.println(15 >> 2); // 15 / 2 / 2 = 3System.out.println(-10.4 % 3); // -1.4 近似值int i = 66;System.out.println(++i + i); // 134}
}
小結
一、對于 &
、 |
、 ^
、 ~
的運算
-
(1)首先得到操作數的補碼
-
(2)看是什么運算符,回想對應的操作規則,在操作數的補碼基礎上按照規則操作,得到操作后的補碼
-
(3)把操作后的補碼轉成源碼,得到操作結果