最近在學(xué)NodeJs,然后練手做項(xiàng)目的時(shí)候想用下位運(yùn)算冕屯,需求是除2舍小數(shù)位,于是想像Java一樣拂苹,直接除2安聘,發(fā)現(xiàn)并不行
console.log(5/2);
sivan@sivan-All-Series:~/workspace/nodejs/interesting_book$ node h.js
2.5
想了下發(fā)現(xiàn)很正常,因?yàn)镴avaScript是弱數(shù)據(jù)語(yǔ)言瓢棒,全部的變量都可以用一個(gè)var來(lái)聲明的浴韭,所以結(jié)果的表現(xiàn)是浮點(diǎn)型,確實(shí)很正常脯宿。
于是換了一種方式念颈,之間看Java的部分源碼看到位運(yùn)算的相關(guān)操作(后面會(huì)提),所以在這也試下位運(yùn)算
console.log(5/2>>1/2);
sivan@sivan-All-Series:~/workspace/nodejs/interesting_book$ node h.js
2
結(jié)果一試就不得了了连霉,居然還真的試出來(lái)了
而在js的運(yùn)算符中榴芳,算術(shù)運(yùn)算符的優(yōu)先級(jí)是大于移位運(yùn)算符的,也就是上面的代碼可以換成這樣
console.log(2.5 >> 0.5);
sivan@sivan-All-Series:~/workspace/nodejs/interesting_book$ node h.js
2
而結(jié)果確實(shí)一樣窘面,覺(jué)得很黑科技翠语,居然還能用浮點(diǎn)數(shù)做移位運(yùn)算,右移0.5位财边?這么黑科技的肌括,于是這個(gè)時(shí)候,去Java上嘗試了一下
這邊就很正常啦,因?yàn)镴ava里面谍夭,整數(shù)之間進(jìn)行運(yùn)算黑滴,得到的數(shù)還是整數(shù),也就是上面的圖片實(shí)際上相當(dāng)于(2 >> 0)
于是測(cè)試下
可見(jiàn)確實(shí)如同猜測(cè)一樣
于是紧索,結(jié)合Java里出現(xiàn)的情況袁辈,對(duì)JS中的情況做了個(gè)猜測(cè),js在有算術(shù)運(yùn)算和移位運(yùn)算同時(shí)存在的情況下珠漂,會(huì)將算術(shù)運(yùn)算的結(jié)果轉(zhuǎn)成整型再運(yùn)算
下面驗(yàn)證下猜測(cè)
console.log(5/2>>1/2);
console.log(2.5 >> 0.5);
console.log(5/2 >> 0);
console.log(2 >> 1/2);
console.log(5.9/2 >> 0);
console.log(2 >> 0);
如無(wú)意外晚缩,這一批的log的結(jié)果,都會(huì)是2
sivan@sivan-All-Series:~/workspace/nodejs/interesting_book$ node h.js
2
2
2
2
2
2
結(jié)果確實(shí)如同預(yù)料般媳危。
那這個(gè)位運(yùn)算有啥用呢荞彼?
首先
哈哈哈,起碼知道待笑,在JS中想得到除以某個(gè)數(shù)舍小數(shù)位鸣皂,只要右移或者左移0位就行了,像console.log(5/2 >> 0);---->2
這樣暮蹂。
除了這個(gè)發(fā)現(xiàn)之外寞缝,其實(shí)位運(yùn)算確實(shí)挺方便的,比如
想要放大或者縮小2的N次冪的倍數(shù)仰泻,只要左移或者右移N位就行了
移幾位這個(gè)可能會(huì)迷糊荆陆,其實(shí)聯(lián)想下十進(jìn)制就行了,500右移一位變成50我纪,縮小了10倍慎宾,右移兩位變成5,縮小了100倍也就是10的2次冪浅悉,所以無(wú)論什么進(jìn)制都一樣,移動(dòng)N位券犁,就變化進(jìn)制的N次冪
其次還有一個(gè)术健,如何快速得到某個(gè)數(shù)最接近的偏大2的次冪數(shù),比如15--16,16--16,17--32
答案就在HashMap的源碼
重點(diǎn)是n |= n >>> N
這幾行代碼粘衬,畫(huà)個(gè)圖就懂了
因?yàn)檫M(jìn)行了多次|=運(yùn)算的運(yùn)算荞估,所以可以確保從最高位到最低位都是1,也就是值為2的N次方-1
其中因?yàn)閖ava中int的長(zhǎng)度為32為稚新,所以有
n |= n >>> 16;
勘伺,這樣就能確保數(shù)很大的時(shí)候都能每一位都做過(guò)|=運(yùn)算
總結(jié)
其實(shí)位運(yùn)算的騷操作還有很多,只不過(guò)水平有限褂删,計(jì)算機(jī)組成原理學(xué)的也不怎么樣飞醉,所以這些其實(shí)也只是小打小鬧。
水平有限屯阀,難免有錯(cuò)缅帘,還請(qǐng)諸君指正轴术。