JavaScript的位運(yùn)算符為什么可以取整呢?取整的原理是什么呢?
比如 12.334 << 0 得出的結(jié)果是12,請(qǐng)問(wèn)為什么呢?
位操作符用于在最基本的層次上,即按內(nèi)存中表示數(shù)值的位來(lái)操作數(shù)值。ECMAScript 中的所有數(shù)
值都以 IEEE-754 64 位格式存儲(chǔ),但位操作符并不直接操作 64 位的值。而是先將 64 位的值轉(zhuǎn)換成 32 位
的整數(shù),然后執(zhí)行操作,最后再將結(jié)果轉(zhuǎn)換回 64 位。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),由于 64 位存儲(chǔ)格式是透明的,
因此整個(gè)過(guò)程就像是只存在 32 位的整數(shù)一樣
位運(yùn)算 的操作數(shù)都會(huì)先對(duì)其進(jìn)行抽象的 ToInt32 操作
ToUint32: (Unsigned 32 Bit Integer)
1.Let number be the result of calling ToNumber on the input argument.
2.If number is NaN, +0, ?0, +∞, or ?∞, return +0.
3.Let posInt be sign(number) × floor(abs(number)).
4.Let int32bit be posInt modulo 232; that is, a finite integer value k of Number type with positive sign and less than 232 in magnitude such that the mathematical difference of posInt and k is mathematically an integer multiple of 232.
5.Return int32bit.
三四步就是個(gè)求整取余數(shù)的過(guò)程
<<0 對(duì)實(shí)際的值沒(méi)有進(jìn)行具體的位移操作,但是仍然會(huì)進(jìn)行其中的 ToInt32 操作,在一定的范圍內(nèi)就是簡(jiǎn)單的按絕對(duì)值取整,超出這個(gè)范圍就會(huì)變成意想不到的值
位運(yùn)算符用于對(duì)二進(jìn)制位
進(jìn)行計(jì)算,這些位運(yùn)算符直接處理每一個(gè)比特位(bit),所以是非常底層的運(yùn)算,好處是速度極快
,缺點(diǎn)是很不直觀,許多場(chǎng)合不能使用它們
。
位運(yùn)算符只對(duì)整數(shù)
起作用,如果一個(gè)運(yùn)算子不是整數(shù),會(huì)自動(dòng)轉(zhuǎn)為整數(shù)后再執(zhí)行。雖然在JavaScript內(nèi)部,數(shù)值都是以64位浮點(diǎn)數(shù)的形式儲(chǔ)存,但是做位運(yùn)算的時(shí)候,是以32位帶符號(hào)的整數(shù)
進(jìn)行運(yùn)算的,并且返回值也是一個(gè)32位帶符號(hào)的整數(shù)
。
回到上面的問(wèn)題:
這是左移運(yùn)算符
,左移運(yùn)算符表示將一個(gè)數(shù)的二進(jìn)制值向左移動(dòng)指定的位數(shù),尾部補(bǔ)0,即乘以2的指定次方(最高位即符號(hào)位不參與移動(dòng))。
左移0
位,就相當(dāng)于將該數(shù)值轉(zhuǎn)為32位整數(shù),等同于取整,對(duì)于正數(shù)和負(fù)數(shù)都有效。
這個(gè)涉及到JavaScript對(duì)位運(yùn)算符的處理。我們要知道,js中數(shù)值都是IEEE 764標(biāo)準(zhǔn),但標(biāo)準(zhǔn)中規(guī)定<<
、>>
、~
等位運(yùn)算符會(huì)對(duì)僅為32位的數(shù)值定義,所有會(huì)有一個(gè)ToInt32
的抽象操作,即32位有符號(hào)整數(shù)。<< 0
表明位移為零,所有就截?cái)嗔诵?shù)部分。下面的也可以:
~~12.334
參考:you dont konw js
you dont know js
對(duì)于使用位運(yùn)算是否有副作用,在知乎這里有討論
我的看法是,使用位運(yùn)算符有點(diǎn)geek,但語(yǔ)義化并不清楚。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。