java 左移 返回值_java左移右移运算符详解
在閱讀源碼的過(guò)程中,經(jīng)常會(huì)看到這些符號(hào)<< ,>>,>>>,這些符號(hào)在Java中叫移位運(yùn)算符,在寫代碼的過(guò)程中,雖然我們基本上不會(huì)去寫這些符號(hào),但需要明白這些符號(hào)的運(yùn)算原理,比如HashMap中有以下代碼:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//左移
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);//無(wú)符號(hào)右移
}
上段代碼中就包含左移運(yùn)算符<>>。這篇文章詳細(xì)說(shuō)一下這三個(gè)符號(hào):
1、左移運(yùn)算符:<<
先隨便定義一個(gè)int類型的數(shù)int,十進(jìn)制的value = 733183670,轉(zhuǎn)換成二進(jìn)制在計(jì)算機(jī)中的表示如下:
value << 1,左移1位
左移1位后換算成十進(jìn)制的值為:1466367340,剛好是733183670的兩倍, 有些人在乘2操作時(shí)喜歡用左移運(yùn)算符來(lái)替代。
value << 8,左移8位看一下:
左移8位后變成了十進(jìn)制的值為:-1283541504,移動(dòng)8位后,由于首位變成了1,也就是說(shuō)成了負(fù)數(shù),在使用中要考慮變成負(fù)數(shù)的情況。
根據(jù)這個(gè)規(guī)則,左移32位后,右邊補(bǔ)上32個(gè)0值是不是就變成了十進(jìn)制的0了?答案是NO,當(dāng)int類型進(jìn)行左移操作時(shí),左移位數(shù)大于等于32位操作時(shí),會(huì)先求余(%)后再進(jìn)行左移操作。也就是說(shuō)左移32位相當(dāng)于不進(jìn)行移位操作,左移40位相當(dāng)于左移8位(40%32=8)。當(dāng)long類型進(jìn)行左移操作時(shí),long類型在二進(jìn)制中的體現(xiàn)是64位的,因此求余操作的基數(shù)也變成了64,也就是說(shuō)左移64位相當(dāng)于沒(méi)有移位,左移72位相當(dāng)于左移8位(72%64=8),寫一段代碼來(lái)測(cè)試一下
int intValue = 733183670;//隨意寫一個(gè)數(shù)
System.out.println("intValue:" + (intValue));//打印intValue
System.out.println("intValue左移1位:" + (intValue << 1));//左移1位
System.out.println("intValue左移8位:" + (intValue << 8));//左移8位
//當(dāng)int類型左移位數(shù)大于等于32位操作時(shí),會(huì)先求余后再進(jìn)行移位操作
System.out.println("intValue左移32位:" + (intValue << 32));//求余為32%32=0,相當(dāng)于左移0位(不移位)
System.out.println("intValue左移40位:" + (intValue << 40));//求余為40%32=8,相當(dāng)于左移8位
System.out.println("intValue左移64位:" + (intValue << 64));//求余為64%32=0,相當(dāng)于左移0位(不移位)
long longValue = 733183670L;
System.out.println("longValue:" + (longValue));//打印longValue
System.out.println("longValue左移1位:" + (longValue << 1));//左移1位
System.out.println("longValue左移8位:" + (longValue << 8));//左移8位
//當(dāng)long類型左移位數(shù)大于等于64位操作時(shí),會(huì)先求余后再進(jìn)行移位操作
System.out.println("longValue左移64位:" + (longValue << 64));//求余為64%64=0,相當(dāng)于左移0位(不移位)
System.out.println("longValue左移72位:" + (longValue << 72));//求余為72%64=8,相當(dāng)于左移8位
System.out.println("longValue左移128位:" + (longValue << 128));//求余為128%64=0,相當(dāng)于左移0位(不移位)
看一下結(jié)果:
由于double,float在二進(jìn)制中的表現(xiàn)比較特殊,因此不能來(lái)進(jìn)行移位操作,報(bào)錯(cuò),編譯不過(guò),如下圖:
注意:其它幾種整形byte,short移位前會(huì)先轉(zhuǎn)換為int類型(32位)再進(jìn)行移位,這里就不寫代碼測(cè)試了,大家有興趣可自行測(cè)試。
綜上所述:左移 << 其實(shí)很簡(jiǎn)單,也就是說(shuō)丟棄左邊指定位數(shù),右邊補(bǔ)0。
2、右移運(yùn)算符:>>
還是這個(gè)數(shù):733183670
value >> 1,右移1位
右移1位后換算成十進(jìn)制的值為:366591835,剛好是733183670的1半, 有些人在除2操作時(shí)喜歡用右移運(yùn)算符來(lái)替代
value >> 8,右移8位看一下
寫一段代碼測(cè)試一下
int intValue = 733183670;//隨意寫一個(gè)數(shù)
System.out.println("intValue:" + (intValue));//打印intValue
System.out.println("intValue右移1位:" + (intValue >> 1));//右移1位
System.out.println("intValue右移8位:" + (intValue >> 8));//右移8位
//當(dāng)int類型右移位數(shù)大于等于32位操作時(shí),會(huì)先求余后再進(jìn)行移位操作
System.out.println("intValue右移32位:" + (intValue >> 32));//求余為32%32=0,相當(dāng)于右移0位(不移位)
System.out.println("intValue右移40位:" + (intValue >> 40));//求余為40%32=8,相當(dāng)于右移8位
System.out.println("intValue右移64位:" + (intValue >> 64));//求余為64%32=0,相當(dāng)于右移0位(不移位)
long longValue = 733183670L;
System.out.println("longValue:" + (longValue));//打印longValue
System.out.println("longValue右移1位:" + (longValue >> 1));//右移1位
System.out.println("longValue右移8位:" + (longValue >> 8));//右移8位
//當(dāng)long類型右移位數(shù)大于等于64位操作時(shí),會(huì)先求余后再進(jìn)行移位操作
System.out.println("longValue右移64位:" + (longValue >> 64));//求余為64%64=0,相當(dāng)于右移0位(不移位)
System.out.println("longValue右移72位:" + (longValue >> 72));//求余為72%64=8,相當(dāng)于右移8位
System.out.println("longValue右移128位:" + (longValue >> 128));//求余為128%64=0,相當(dāng)于右移0位(不移位)
結(jié)果:
和左移一樣,int類型移位大于等于32位時(shí),long類型大于等于64位時(shí),會(huì)先做求余處理再位移處理,byte,short移位前會(huì)先轉(zhuǎn)換為int類型(32位)再進(jìn)行移位。以上是正數(shù)的位移,我們?cè)賮?lái)看看負(fù)數(shù)的右移運(yùn)算,如圖,負(fù)數(shù)intValue:-733183670的二進(jìn)制表現(xiàn)如下圖:
右移8位,intValue >> 8
綜上所述:右移運(yùn)算符>>的運(yùn)算規(guī)則也很簡(jiǎn)單,丟棄右邊指定位數(shù),左邊補(bǔ)上符號(hào)位。
3、無(wú)符號(hào)右移運(yùn)算符:>>>
無(wú)符號(hào)右移運(yùn)算符>>>和右移運(yùn)算符>>是一樣的,只不過(guò)右移時(shí)左邊是補(bǔ)上符號(hào)位,而無(wú)符號(hào)右移運(yùn)算符是補(bǔ)上0,也就是說(shuō),對(duì)于正數(shù)移位來(lái)說(shuō)等同于:>>,負(fù)數(shù)通過(guò)此移位運(yùn)算符能移位成正數(shù)。以-733183670>>>8為例來(lái)畫一下圖
無(wú)符號(hào)右移運(yùn)算符>>的運(yùn)算規(guī)則也很簡(jiǎn)單,丟棄右邊指定位數(shù),左邊補(bǔ)上0。
摘自https://zhuanlan.zhihu.com/p/30108890
總結(jié)
以上是生活随笔為你收集整理的java 左移 返回值_java左移右移运算符详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 荣耀100系列核心配置曝光:首发骁龙7G
- 下一篇: java中employee_java E