摘要:最近看源碼,發(fā)現(xiàn)有用到了位運算符,以前也見過類似的用法,所以研究了下為什么這樣用。按位非運算符先看看的定義位運算由否定號表示,它是中為數(shù)不多的與二進(jìn)制算術(shù)有關(guān)的運算符之一。
最近看zepto源碼,發(fā)現(xiàn)有用到了位運算符-not (~),以前也見過類似“~~value”的用法,所以研究了下為什么這樣用。
按位非運算符“~”先看看w3c的定義:
位運算 NOT 由否定號(~)表示,它是 ECMAScript 中為數(shù)不多的與二進(jìn)制算術(shù)有關(guān)的運算符之一。
位運算 NOT 是三步的處理過程:
把運算數(shù)轉(zhuǎn)換成 32 位數(shù)字
把二進(jìn)制數(shù)轉(zhuǎn)換成它的二進(jìn)制反碼(0->1, 1->0)
把二進(jìn)制數(shù)轉(zhuǎn)換成浮點數(shù)
簡單的理解,對任一數(shù)值 x 進(jìn)行按位非操作的結(jié)果為 -(x + 1)
console.log("~null: ", ~null); // => -1 console.log("~undefined: ", ~undefined); // => -1 console.log("~0: ", ~0); // => -1 console.log("~{}: ", ~{}); // => -1 console.log("~[]: ", ~[]); // => -1 console.log("~(1/0): ", ~(1/0)); // => -1 console.log("~false: ", ~false); // => -1 console.log("~true: ", ~true); // => -2 console.log("~1.2543: ", ~1.2543); // => -2 console.log("~4.9: ", ~4.9); // => -5 console.log("~(-2.999): ", ~(-2.999)); // => 1
那么, ~~x就為 -(-(x+1) + 1)
console.log("~~null: ", ~~null); // => 0 console.log("~~undefined: ", ~~undefined); // => 0 console.log("~~0: ", ~~0); // => 0 console.log("~~{}: ", ~~{}); // => 0 console.log("~~[]: ", ~~[]); // => 0 console.log("~~(1/0): ", ~~(1/0)); // => 0 console.log("~~false: ", ~~false); // => 0 console.log("~~true: ", ~~true); // => 1 console.log("~~1.2543: ", ~~1.2543); // => 1 console.log("~~4.9: ", ~~4.9); // => 4 console.log("~~(-2.999): ", ~~(-2.999)); // => -2~value的使用
判斷數(shù)值中是否有某元素時,以前這樣判斷:
if(arr.indexOf(ele) > -1){...} //易讀
現(xiàn)在可以這樣判斷,兩者效率:
if(~arr.indexOf(ele)){...} //簡潔~~value的使用
對于浮點數(shù),~~value可以代替parseInt(value),而且前者效率更高些
parseInt(-2.99) //-2 ~~(-2.99) //-2測試
var time1 = +new Date(); var count = 5000000; var ele = 1; var arr = [1,2,4,5,2]; var h = 1.01; console.time("parseInt"); for (var i = count; i > 0; i--) { parseInt(h); } console.timeEnd("parseInt"); //84.385ms console.time("~~"); for (var i = count; i>0; i--) { ~~h; } console.timeEnd("~~"); //13.386ms console.time("arr.indexOf(ele) > -1"); for (var j = count; j>0; j--) { arr.indexOf(ele) > -1; } console.timeEnd("arr.indexOf(ele) > -1"); //16.263ms console.time("~arr.indexOf(ele)"); for (var i = count; i>0; i--) { ~arr.indexOf(ele); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85958.html
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進(jìn)行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應(yīng)用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負(fù)數(shù)存儲采用的形式是二進(jìn)制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進(jìn)行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進(jìn)行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應(yīng)用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負(fù)數(shù)存儲采用的形式是二進(jìn)制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進(jìn)行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進(jìn)行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應(yīng)用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負(fù)數(shù)存儲采用的形式是二進(jìn)制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進(jìn)行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:將任一數(shù)值與執(zhí)行按位與操作,其結(jié)果都為。中應(yīng)用判斷奇偶性偶數(shù)奇數(shù)按位異或規(guī)則每一位都不同,結(jié)果才為將任一數(shù)值與進(jìn)行異或操作,其結(jié)果為。 位運算在算法中很有用,速度可以比四則運算快很多。 To2orTo10 JS中十進(jìn)制轉(zhuǎn)二進(jìn)制: (val).toString(2)JS中二進(jìn)制轉(zhuǎn)十進(jìn)制: parseInt(val, 2) JS中規(guī)定安全整數(shù)的范圍是-2^53~2^53,所以大于90071...
摘要:例如,十進(jìn)制數(shù),用二進(jìn)制表示則為。按位操作符操作數(shù)字的二進(jìn)制形式,但是返回值依然是標(biāo)準(zhǔn)的數(shù)值。不同為真相同為假二進(jìn)制按位異或運算從左到右按位非為真,為假對每一項進(jìn)行非操作,遇真則假,遇假則真。 二進(jìn)制與十六進(jìn)制 二進(jìn)制用 0 1 表示 2= 10十六進(jìn)制 前綴0x 用0123456789ABCDEF表示 2= 0x2二進(jìn)制與十六進(jìn)制的轉(zhuǎn)換十六進(jìn)制的每位 等于二進(jìn)制的四位 十六進(jìn)制 0x...
閱讀 1276·2021-11-24 09:39
閱讀 1533·2021-09-07 09:59
閱讀 3490·2019-08-30 15:54
閱讀 2486·2019-08-30 11:00
閱讀 2678·2019-08-29 15:06
閱讀 2169·2019-08-26 13:52
閱讀 438·2019-08-26 13:24
閱讀 2504·2019-08-26 12:20