日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java运算符详解

發布時間:2023/12/3 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的“原碼”,根據正數的二進制數來得到所謂“原碼
    -5的“原碼”:1000 0101,高位是符號位,1表示負數,0表示正數,所以不參與計算,0101乘以權數再求和,得到5,因為高位是1,所以是-5,所以認為這是-5的“原碼”。
  • 再對“原碼”取反,符號位不動,得到所謂“反碼”:1111 1010
  • 再對“反碼”+1,得到-5的補碼:1111 1011,夠嗆了~
  • 再左移2位,得到:1110 1100(-5<<2后得到的結果值,是補碼)
  • 為了得知1011 0000對應的十進制數是多少,居然還要反操作(逆運算),去得到所謂“原碼”,因此-1,得到所謂“反碼”:1110 1011
  • 然后再對“反碼”取反(符號位不動),得到所謂“原碼”:1001 0100
  • 因為0001 0100,是正數20,而1001 0100的符號位是1,所以是負數,結果就是-20。醉了,這個思路!!!!!!
  • 總結:負數的原碼取反(符號位不動)+1得到補碼,負數的補碼-1再取反(符號位不動)得到原碼。

    上面的計算思路把問題復雜化了,其實是“錯誤”的計算思路。按此思路,補碼才需要反向計算得到原碼(因為補碼無法直接計算得到十進制數),而正數則不需要,因為正數本就是原碼,可以直接根據位權計算得到十進制數。其實這樣的理解,就是認為補碼就是負數,正數不存在補碼說法,正數就是原碼。然而實際上無論負數還是正數在計算機內就是按二進制補碼存儲,補碼并不表示就是負數,補碼只是計算機內二進制運算規則的叫法而已。所以負數的二進制數叫補碼,正數的二進制數也叫補碼

    當然這樣表述會更好理解點,正數的補碼就是原碼,負數的補碼不是原碼,即便如此,也是活生生地引入原碼,所以同樣不是合理的理解。

    正確的計算思路如下:

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

    并不合理的思路:

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

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

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

    注意:移位運算遵循規則

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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。