Java 無(wú)符號(hào)右移與右移運(yùn)算符的使用介紹
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));
}
輸出:

計(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));
}
輸出:(注意和以上例子比較)

解釋

總結(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
到此這篇關(guān)于Java 無(wú)符號(hào)右移與右移運(yùn)算符的使用介紹的文章就介紹到這了,更多相關(guān)Java 無(wú)符號(hào)右移與右移運(yùn)算符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中常見(jiàn)XML解析器的使用詳解(JAXP,DOM4J,Jsoup,JsoupXPath)
為了處理和操作XML數(shù)據(jù),我們需要使用XML解析器,本文將介紹幾種常用的XML解析器,包括JAXP、DOM4J、Jsoup和JsoupXPath,需要的小伙伴可以參考一下2023-11-11
詳解java中的6種單例寫(xiě)法及優(yōu)缺點(diǎn)
在java中,單例有很多種寫(xiě)法,面試時(shí),手寫(xiě)代碼環(huán)節(jié),除了寫(xiě)算法題,有時(shí)候也會(huì)讓手寫(xiě)單例模式,這里記錄一下單例的幾種寫(xiě)法和優(yōu)缺點(diǎn)。需要的朋友可以參考下2018-11-11
Mybatis?Plus?中的LambdaQueryWrapper示例詳解
這篇文章主要介紹了Mybatis?Plus?中的LambdaQueryWrapper,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
劍指Offer之Java算法習(xí)題精講鏈表與字符串及數(shù)組
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03
關(guān)于java.lang.NumberFormatException: null的問(wèn)題及解決
這篇文章主要介紹了關(guān)于java.lang.NumberFormatException: null的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
SpringCloud Zuul和Gateway的實(shí)例代碼(搭建方式)
本文主要介紹了SpringCloudZuul和SpringCloudGateway的簡(jiǎn)單示例,SpringCloudGateway是推薦使用的API網(wǎng)關(guān)解決方案,基于SpringFramework5和ProjectReactor構(gòu)建,具有更高的性能和吞吐量2025-02-02
Java:DocumentBuilderFactory調(diào)用XML的方法實(shí)例
Java:DocumentBuilderFactory調(diào)用XML的方法實(shí)例,需要的朋友可以參考一下2013-04-04

