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