成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS按位非運算符(~)及雙非(~~)的使用

yagami / 1243人閱讀

摘要:最近看源碼,發(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

相關(guān)文章

  • 深入研究js運算及用法

    摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進(jìn)行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應(yīng)用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負(fù)數(shù)存儲采用的形式是二進(jìn)制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進(jìn)行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...

    zhoutao 評論0 收藏0
  • 深入研究js運算及用法

    摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進(jìn)行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應(yīng)用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負(fù)數(shù)存儲采用的形式是二進(jìn)制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進(jìn)行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...

    hlcfan 評論0 收藏0
  • 深入講解js運算及實際用法

    摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進(jìn)行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應(yīng)用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負(fù)數(shù)存儲采用的形式是二進(jìn)制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進(jìn)行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...

    jifei 評論0 收藏0
  • 按位操作符

    摘要:將任一數(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...

    caiyongji 評論0 收藏0
  • websocket 二進(jìn)制數(shù)據(jù)傳輸基礎(chǔ)準(zhǔn)備工作

    摘要:例如,十進(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...

    LeviDing 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<