鍍金池/ 問答/iOS  HTML/ JavaScript位運(yùn)算符

JavaScript位運(yùn)算符

JavaScript的位運(yùn)算符為什么可以取整呢?取整的原理是什么呢?
比如 12.334 << 0 得出的結(jié)果是12,請(qǐng)問為什么呢?

回答
編輯回答
青瓷

位操作符用于在最基本的層次上,即按內(nèi)存中表示數(shù)值的位來操作數(shù)值。ECMAScript 中的所有數(shù)
值都以 IEEE-754 64 位格式存儲(chǔ),但位操作符并不直接操作 64 位的值。而是先將 64 位的值轉(zhuǎn)換成 32 位
的整數(shù),然后執(zhí)行操作,最后再將結(jié)果轉(zhuǎn)換回 64 位。對(duì)于開發(fā)人員來說,由于 64 位存儲(chǔ)格式是透明的,
因此整個(gè)過程就像是只存在 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ù)的過程

<<0 對(duì)實(shí)際的值沒有進(jìn)行具體的位移操作,但是仍然會(huì)進(jìn)行其中的 ToInt32 操作,在一定的范圍內(nèi)就是簡(jiǎn)單的按絕對(duì)值取整,超出這個(gè)范圍就會(huì)變成意想不到的值

2017年11月4日 04:40
編輯回答
夏木

位運(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ù)

回到上面的問題:
這是左移運(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ù)都有效。

2017年8月18日 08:06
編輯回答
任她鬧

因?yàn)閖avascript的位運(yùn)算符只對(duì)32位整數(shù)有效,所以在進(jìn)行位運(yùn)算的時(shí)候會(huì)把運(yùn)算符兩邊的數(shù)進(jìn)行強(qiáng)制轉(zhuǎn)換成32位的整數(shù),所以對(duì)小數(shù)進(jìn)行位運(yùn)算會(huì)變成整數(shù)。12.334 << 0表達(dá)式兩邊取整之后就相當(dāng)于12<<0,因此位運(yùn)算符可以取整,不過只限32位,超過32位就會(huì)出錯(cuò)。

2017年3月8日 04:03
編輯回答
何蘇葉

日經(jīng)問題

因?yàn)镴avaScript引擎會(huì)先把浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)再移位,而你移位的位數(shù)是0,結(jié)果當(dāng)然就是當(dāng)前浮點(diǎn)數(shù)的整數(shù)嘍。

2017年5月20日 16:34
編輯回答
陌南塵

看代碼:

12.334.toString(2);//"1100.010101011000000100000110001001001101110100101111" //轉(zhuǎn)為二進(jìn)制
所以 12.334 << 0 相當(dāng)于 二進(jìn)制 1100 向左移送0位 ;  
parseInt('1100',2) //12
2018年9月9日 06:40
編輯回答
氕氘氚

這個(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,但語義化并不清楚。

2017年7月31日 11:03