溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java 無(wú)符號(hào)右移與右移運(yùn)算符是什么?

發(fā)布時(shí)間:2020-06-23 13:52:08 來(lái)源:億速云 閱讀:1064 作者:清晨 欄目:開(kāi)發(fā)技術(shù)

不懂Java 無(wú)符號(hào)右移與右移運(yùn)算符是什么??其實(shí)想解決這個(gè)問(wèn)題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。

Java 無(wú)符號(hào)右移介紹

 最近學(xué)習(xí)Java,看到>>>運(yùn)算符不太了解,也百度查了查,解釋得不是很清晰。那么下面講解我對(duì)>>>運(yùn)算符的認(rèn)識(shí): >>>運(yùn)算符:無(wú)符號(hào)右移運(yùn)算符 在學(xué)習(xí)>>>無(wú)符號(hào)右移運(yùn)算符前,我們先了解右移運(yùn)算符>>

下表列出了位運(yùn)算符的基本運(yùn)算,假設(shè)整數(shù)變量A的值為60和變量B的值為13:

操作符描述例子
如果相對(duì)應(yīng)位都是1,則結(jié)果為1,否則為0(A&B),得到12,即0000 1100
|如果相對(duì)應(yīng)位都是0,則結(jié)果為0,否則為1(A | B)得到61,即 0011 1101
^如果相對(duì)應(yīng)位值相同,則結(jié)果為0,否則為1(A ^ B)得到49,即 0011 0001
〜按位取反運(yùn)算符翻轉(zhuǎn)操作數(shù)的每一位,即0變成1,1變成0。(〜A)得到-61,即1100 0011
<<按位左移運(yùn)算符。左操作數(shù)按位左移右操作數(shù)指定的位數(shù)。A << 2得到240,即 1111 0000
>>按位右移運(yùn)算符。左操作數(shù)按位右移右操作數(shù)指定的位數(shù)。A >> 2得到15即 1111
>>>按位右移補(bǔ)零操作符。左操作數(shù)的值按右操作數(shù)指定的位數(shù)右移,移動(dòng)得到的空位以零填充。A>>>2得到15即0000 1111

右移運(yùn)算符

>>右移運(yùn)算符:正數(shù)高位補(bǔ)0,負(fù)數(shù)高位補(bǔ)1

看一個(gè)例子:

public static void main(String[] args) {
    /**
     * 10的二進(jìn)制:1010
     * 因?yàn)槭钦龜?shù),所以計(jì)算機(jī)高位的0不會(huì)輸出
     * 負(fù)數(shù)會(huì)輸出32位bit
     */
    System.out.println(Integer.toBinaryString(10 >> 2));
    System.out.println(Integer.toBinaryString(-10));
    System.out.println(Integer.toBinaryString(-10 >> 2));
  }

輸出:

Java 無(wú)符號(hào)右移與右移運(yùn)算符是什么?

計(jì)算機(jī)計(jì)算數(shù)據(jù)以補(bǔ)碼的方式進(jìn)行計(jì)算
正數(shù)原碼、反碼、補(bǔ)碼不變
負(fù)數(shù)(-10):以8bit(位)表示
原碼----> 1000 1010
反碼----> 1111 0101(符號(hào)位不變,其他位取反)
補(bǔ)碼----> 1111 0110(反碼基礎(chǔ)上 + 1)
所以會(huì) -10 會(huì)輸出:1111…0110
-10 >> 2 :1111…1101(高位補(bǔ)1)
10 >> 2:0000…0010

無(wú)符號(hào)右移運(yùn)算符

>>> 無(wú)符號(hào)右移運(yùn)算符與 >> 右移運(yùn)算符的正數(shù)相同,只不過(guò)關(guān)鍵在于負(fù)數(shù)的不同,>>>運(yùn)算符右移:**負(fù)數(shù)高位補(bǔ) 0 ,其它位不變**

看一個(gè)例子:

public static void main(String[] args) {
    System.out.println(Integer.toBinaryString(10 >>> 2));
    System.out.println(Integer.toBinaryString(-10));
    System.out.println(Integer.toBinaryString(-10 >>> 2));
  }

輸出:(注意和以上例子比較)

Java 無(wú)符號(hào)右移與右移運(yùn)算符是什么?

解釋

Java 無(wú)符號(hào)右移與右移運(yùn)算符是什么?

總結(jié):
>>> 和 >> 的區(qū)別在于:

  • >>> 負(fù)數(shù)高位補(bǔ) 0;
  • >> 負(fù)數(shù)高位補(bǔ)1;

 左移運(yùn)算符   <<

左移的規(guī)則只記住一點(diǎn):該數(shù)對(duì)應(yīng)的二進(jìn)制碼補(bǔ)碼整體左移,丟棄最高位,0補(bǔ)最低位

如果移動(dòng)的位數(shù)超過(guò)了該類(lèi)型的最大位數(shù),那么編譯器會(huì)對(duì)移動(dòng)的位數(shù)取模。如對(duì)int型移動(dòng)33位,實(shí)際上只移動(dòng)了33%32=1位;

當(dāng)左移的運(yùn)算數(shù)是int 類(lèi)型時(shí),每移動(dòng)1位它的第31位(0~31)就要被移出并且丟棄;
當(dāng)左移的運(yùn)算數(shù)是long 類(lèi)型時(shí),每移動(dòng)1位它的第63(0~63)位就要被移出并且丟棄。
當(dāng)左移的運(yùn)算數(shù)是byte 和short類(lèi)型時(shí),將自動(dòng)把這些類(lèi)型擴(kuò)大為 int 型。

正數(shù)和負(fù)數(shù)的左移操作分兩種情況:

(1)左移n位(1<=n<=31)之后操作數(shù)沒(méi)有溢出

         這種情況等價(jià)于===原操作*2^n,例如60的二進(jìn)制補(bǔ)碼是 111100=2^5+2^4+2^3+2^2=60

60左移25位之后的二進(jìn)制補(bǔ)碼為:01111000000000000000000000000000 =(2^5+2^4+2^3+2^2)*2^25=2^30+2^29+2^28+2^27

而int類(lèi)型占四個(gè)字節(jié),一共三十二位,第一位是符號(hào)位,int類(lèi)型的數(shù)值范圍是(-2^31~2^31-1)所以60左移25位操作數(shù)沒(méi)有溢出,最高位還是0;

(2)左移n位(1<=n<=31)之后操作數(shù)溢出

但如果再向左移動(dòng)一位的話,即60左移26位之后的二進(jìn)制補(bǔ)碼為:

11110000000000000000000000000000 =(2^5+2^4+2^3+2^2)*2^26=2^31+2^30+2^29+2^28

此時(shí)二進(jìn)制最高位是1,操作數(shù)溢出,變成負(fù)數(shù)。

60移位前二進(jìn)制(補(bǔ)碼表示):
111100  60
-60移位前二進(jìn)制(補(bǔ)碼表示):
11111111111111111111111111000100  -60
 
左移的規(guī)則只記住一點(diǎn):丟棄最高位,0補(bǔ)最低位
60左移1位的二進(jìn)制(補(bǔ)碼表示):
1111000  120
60左移25位的二進(jìn)制(補(bǔ)碼表示):
1111000000000000000000000000000  2013265920
60左移26位的二進(jìn)制(補(bǔ)碼表示):
11110000000000000000000000000000  -268435456
60左移30位的二進(jìn)制(補(bǔ)碼表示):
0  0
-60左移1位的二進(jìn)制(補(bǔ)碼表示):
11111111111111111111111110001000  -120
-60左移25位的二進(jìn)制(補(bǔ)碼表示):
10001000000000000000000000000000  -2013265920
-60左移26位的二進(jìn)制(補(bǔ)碼表示):
10000000000000000000000000000  268435456
-60左移32位的二進(jìn)制(補(bǔ)碼表示):
11111111111111111111111111000100  -60

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Java 無(wú)符號(hào)右移與右移運(yùn)算符是什么??jī)?nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI