Java运算符详解
文章目錄
- 自增自減運算符
- 比較(關系)運算符
- 三元運算符(三目表達式/三目運算)
- 位運算符
- 與(&)
- 或(|)
- 取反(~)
- 異或(^)
- 左移運算符(<<)
- 右移運算符(>>)
- 無符合右移運算符(>>>)
自增自減運算符
屬于算術運算符、一元運算符
自增運算符:++
自減運算符:–
使用格式:寫在變量名稱之前,或者寫在變量名稱之后
單獨使用,前++與后++沒有區別,前–與后–沒有區別;
混合使用,則有重大區別:
1.如果是【前++】,那么變量【立刻+1】,然后拿著結果進行使用,先加后用
2.如果是【后++】,那么首先使用變量本來的數值,【然后再讓變量+1】,先用后加
3.如果是【前–】,那么變量【立刻-1】,然后拿著結果進行使用,先減后用
4.如果是【后–】,那么首先使用變量本來的數值,【然后再讓變量-1】,先用后減
例如:與打印操作混合使用
int num1 = 20; System.out.println(++num1);//21 System.out.println(num1);//21int num2 = 30; System.out.println(num2++);//30 System.out.println(num2);//31比較(關系)運算符
“==” , “!=” , “>” , “<” ,">=" , “<=”
對應的"eq",“nq”,“lt”,“gt”,“le”,"ge"代替。
三元運算符(三目表達式/三目運算)
條件判斷(例如:關系表達式) ? 表達式A : 表達式B
判斷結果true,返回表達式A的值,false則返回表達式B的值。
注意:三元表達式的結果必須被使用
1.要么有變量接收結果
int a = 10;
int b = 20;
int max = a > b ? a : b;
2.要么打印輸出
System.out.println(a > b ? a : b);
3.要么作為方法的返回值
return a > b ? a : b;
位運算符
與(&)、或(|)、異或(^)、取反(~)、左移(<<)、右移(>>)、無符號右移(>>>),位運算其實是針對二進制的運算。
幾進制就是一個位上最多能表示幾個數,如十進制的個位有0 - 9十個數字,八進制有0 -7八個數字,二進制我們自然想到就是0 - 1兩個數字
我們編碼中最小的單位是字節,一個字節有8位,每一位就是一個0或1,所以一個字節用二進制表示如下圖:
與(&)
同為1則為1,否則為0。
也可以這樣理解:
與運算中,相同位之間其實就是兩個Boolean的運算,1代表true,0代表false,“與”就是“且”的意思,所以都是true則是true,否則是false。
4&7,如何計算?
首先我們需要把兩個十進制的數轉換成二進制
4 : 0000 0100
7 : 0000 0111
或(|)
只要其中一個為1,則為1。
也可以這樣理解:
1代表true,0代表false,既然是“或者”,那么只要其中一個是true,則為true,都是false,則為false。
5 | 9,如何計算?
先得到對應的二進制數:
5 : 0000 0101
9 : 0000 1001
取反(~)
將操作數的每位取反,就是把1變0,0變1
~15,如何計算
15的二進制:0000 1111
異或(^)
兩位相同時返回0,不同時返回1。
也可以理解為:相同都是false,不同則是true。
7^15,如何計算
7: 0000 0111
15: 0000 1111
左移運算符(<<)
左移運算符,將操作數的二進制碼整體左移指定位數,右邊空出的以0填充。
例如:12 << 2意思就是12的二進制數向左移動兩位。
12的二進制是:0000 1100
通過這個圖我們可以看出來,所有的二進制數位全都向左移動兩位,然后把右邊空的兩個位用0補上,左邊溢出(移出/舍棄)的兩位去掉,最后得到的結果就是00110000,十進制數就是48。我們用同樣的辦法算12<<3結果是96,8<<4 結果是128。
我們知道二進制數的基數是2,1個位置是2倍,2個位置就是4倍,3個位置就是8倍…,8<<4 就是向左移動4位,就是16倍的關系,而計算的結果是128 = 8 * 16 = 8 * 24,由此我們得知,二進制數左移其實就是做乘法(自動上溢出),8<<4,就是8乘以16倍(24),也由此我們得出一個計算公式:M << n = M*2n。
解析-5<<2的運算思路
網絡看到的解答思路如下:
-5的“原碼”:1000 0101,高位是符號位,1表示負數,0表示正數,所以不參與計算,0101乘以權數再求和,得到5,因為高位是1,所以是-5,所以認為這是-5的“原碼”。
總結:負數的原碼取反(符號位不動)+1得到補碼,負數的補碼-1再取反(符號位不動)得到原碼。
上面的計算思路把問題復雜化了,其實是“錯誤”的計算思路。按此思路,補碼才需要反向計算得到原碼(因為補碼無法直接計算得到十進制數),而正數則不需要,因為正數本就是原碼,可以直接根據位權計算得到十進制數。其實這樣的理解,就是認為補碼就是負數,正數不存在補碼說法,正數就是原碼。然而實際上無論負數還是正數在計算機內就是按二進制補碼存儲,補碼并不表示就是負數,補碼只是計算機內二進制運算規則的叫法而已。所以負數的二進制數叫補碼,正數的二進制數也叫補碼。
當然這樣表述會更好理解點,正數的補碼就是原碼,負數的補碼不是原碼,即便如此,也是活生生地引入原碼,所以同樣不是合理的理解。
正確的計算思路如下:
我們知道正數5的二進制數(也稱為補碼):0000 0101,那么要得到-5的補碼就是取反+1即可,取反得到:1111 1010,然后+1得到:1111 1011,1111 1011這個數就是-5的二進制數
-5<<5可以得到正確的結果嗎?
如果是byte類型,8位補碼運算,那么-5<<5,無法得到正確的結果,因為已經超出了byte的取值范圍
右移運算符(>>)
右移運算符,將操作數的二進制碼整體右移指定位數,左邊空出的以符號位填充,也就是在補位的時候,如果最高位(即符號位)是0就補0,如果最高位是1就補1(或者說正數,就是以0填充。負數,就以1填充)
例如:12 >>2意思就是12的二進制數向右移動兩位。
12的二進制是:0000 1100
例如:-8>>2
通過上面兩個圖我們可以看出來,所有的二進制數位全都向由移動兩位,然后把左邊空的兩個位用0或者1補上,右邊溢出(移出/舍棄)的兩位去掉,最后得到的結果分別是00000011和11111110,十進制數分別是3和-2。
我們知道二進制數的基數是2,1個位置是2倍,2個位置就是4倍,3個位置就是8倍…,12>>2 就是向右移動2位,就是4倍的關系,而計算的結果是3 = 12 / 4 = 12 / 22,由此我們得知,二進制數右移其實就是做除法(自動下溢出),-8>>2,就是-8除以4,即-8/22,也由此我們得出一個計算公式:M >> n = M/2n。
解析-5>>2的計算思路
并不合理的思路:
合理的思路:
無符合右移運算符(>>>)
無符號右移運算符,將操作數的二進制碼整體右移指定位數,左邊空出來的位總是以0填充。無符號右移(>>>)只對32位和64位有意義。
注意:移位運算遵循規則
參考資料
點擊查看運算符詳解
總結