日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java运算符详解

發(fā)布時間:2023/12/3 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java运算符详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 自增自減運算符
  • 比較(關(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的“原碼”,根據(jù)正數(shù)的二進制數(shù)來得到所謂“原碼
    -5的“原碼”:1000 0101,高位是符號位,1表示負數(shù),0表示正數(shù),所以不參與計算,0101乘以權(quán)數(shù)再求和,得到5,因為高位是1,所以是-5,所以認為這是-5的“原碼”。
  • 再對“原碼”取反,符號位不動,得到所謂“反碼”:1111 1010
  • 再對“反碼”+1,得到-5的補碼:1111 1011,夠嗆了~
  • 再左移2位,得到:1110 1100(-5<<2后得到的結(jié)果值,是補碼)
  • 為了得知1011 0000對應(yīng)的十進制數(shù)是多少,居然還要反操作(逆運算),去得到所謂“原碼”,因此-1,得到所謂“反碼”:1110 1011
  • 然后再對“反碼”取反(符號位不動),得到所謂“原碼”:1001 0100
  • 因為0001 0100,是正數(shù)20,而1001 0100的符號位是1,所以是負數(shù),結(jié)果就是-20。醉了,這個思路!!!!!!
  • 總結(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ù)的補碼不是原碼,即便如此,也是活生生地引入原碼,所以同樣不是合理的理解。

    正確的計算思路如下:

  • 首先得到-5的二進制數(shù)(也就是補碼)。
    我們知道正數(shù)5的二進制數(shù)(也稱為補碼):0000 0101,那么要得到-5的補碼就是取反+1即可,取反得到:1111 1010,然后+1得到:1111 1011,1111 1011這個數(shù)就是-5的二進制數(shù)
  • 然后1111 1011左移2位,得到:1110 1100,這就是左移后得到的二進制數(shù),只是你不懂得十進制數(shù)叫多少而已
  • 1110 1100肯定是負數(shù),因為高位是1,所以你只要知道對應(yīng)的十進制正數(shù)多少,自然就可以得知1110 1100對應(yīng)的負的十進制數(shù)多少。二進制的負數(shù)和正數(shù)轉(zhuǎn)換就是取反+1,所以1110 1100取反+1之后的得到對應(yīng)的正數(shù)二進制是:0001 0100,對應(yīng)的十進制數(shù)是:20,那么1110 1100對應(yīng)的十進制數(shù)就是:-20
  • -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的計算思路

    并不合理的思路:

  • -5的補碼:1111 1011
  • 右移兩位得到:1111 1110
  • 因為是負數(shù),需再轉(zhuǎn)為原碼,-1得到反碼:1111 1101
  • 對1111 1101取反,得到原碼:1000 0010
  • 十進制結(jié)果:-2
  • 合理的思路:

  • 先得到5的補碼:00000101
  • 取反+1,得到-5的補碼:11111011
  • 右移2位,得到:11111110
  • 取反+1,得到對應(yīng)正數(shù)補碼:00000010
  • 計算得到對應(yīng)的十進制正數(shù):2,所以11111110對應(yīng)的十進制數(shù)是:-2
  • 無符合右移運算符(>>>)

    無符號右移運算符,將操作數(shù)的二進制碼整體右移指定位數(shù),左邊空出來的位總是以0填充。無符號右移(>>>)只對32位和64位有意義。

    注意:移位運算遵循規(guī)則

  • 低于Int類型(如byte、short、char)的操作數(shù)總是先自動類型轉(zhuǎn)換為int類型后再移位。
  • 對于Int類型的整數(shù)移位a>>b,當b≥32時,系統(tǒng)會用b對32求余(因為int類型只有32位),得到的結(jié)果才是真正移位的位數(shù)。例如,a>>33和a>>1的結(jié)果是完全一樣的,而a>>32和a相同。
  • 對于long類型的整數(shù)移位a>>b,當b≥64時,系統(tǒng)會用b對64求余(因為long類型是64位),得到的結(jié)果才是真正移位的位數(shù)。
  • 進行移位運算不會改變操作數(shù)本身,只是得到了一個新的數(shù)值,而原來的操作數(shù)本身是不會改變的。
  • 參考資料
    點擊查看運算符詳解

    總結(jié)

    以上是生活随笔為你收集整理的Java运算符详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。