Java 移位运算详解
個(gè)人網(wǎng)站:生命不息 折騰不止
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)
注意:其它幾種整形byte,short移位前會(huì)先轉(zhuǎn)換為int類型(32位)再進(jìn)行移位。
綜上所述:左移 << 其實(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位看一下
和左移一樣,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。
4. 快速算出移位運(yùn)算符結(jié)果的方法(只適用小數(shù)值):
在不大于自身數(shù)值類型最大位數(shù)的移位時(shí),一個(gè)數(shù)左移n位,就是將這個(gè)數(shù)乘以2的n次冪;一個(gè)數(shù)右移n位,就是將這個(gè)數(shù)除2的n次冪,然后取整。
比如int32位的(64位也是同樣方法):
如果移動(dòng)位數(shù)超過(guò)了32位怎么辦?把移位數(shù)和32取余數(shù)得到的數(shù)字套用即可:
如 9 >> 67
1、先67對(duì)32取余,結(jié)果是3
2、然后9/8 得到結(jié)果為1
總結(jié)
以上是生活随笔為你收集整理的Java 移位运算详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mobile开发之meta篇
- 下一篇: Java 正则表达式