摘要:最近看源碼,發現有用到了位運算符,以前也見過類似的用法,所以研究了下為什么這樣用。按位非運算符先看看的定義位運算由否定號表示,它是中為數不多的與二進制算術有關的運算符之一。
最近看zepto源碼,發現有用到了位運算符-not (~),以前也見過類似“~~value”的用法,所以研究了下為什么這樣用。
按位非運算符“~”先看看w3c的定義:
位運算 NOT 由否定號(~)表示,它是 ECMAScript 中為數不多的與二進制算術有關的運算符之一。
位運算 NOT 是三步的處理過程:
把運算數轉換成 32 位數字
把二進制數轉換成它的二進制反碼(0->1, 1->0)
把二進制數轉換成浮點數
簡單的理解,對任一數值 x 進行按位非操作的結果為 -(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的使用
判斷數值中是否有某元素時,以前這樣判斷:
if(arr.indexOf(ele) > -1){...} //易讀
現在可以這樣判斷,兩者效率:
if(~arr.indexOf(ele)){...} //簡潔~~value的使用
對于浮點數,~~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); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85958.html
摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:例如,十進制數,用二進制表示則為。按位操作符操作數字的二進制形式,但是返回值依然是標準的數值。不同為真相同為假二進制按位異或運算從左到右按位非為真,為假對每一項進行非操作,遇真則假,遇假則真。 二進制與十六進制 二進制用 0 1 表示 2= 10十六進制 前綴0x 用0123456789ABCDEF表示 2= 0x2二進制與十六進制的轉換十六進制的每位 等于二進制的四位 十六進制 0x...
閱讀 1266·2021-11-24 09:39
閱讀 1517·2021-09-07 09:59
閱讀 3479·2019-08-30 15:54
閱讀 2474·2019-08-30 11:00
閱讀 2669·2019-08-29 15:06
閱讀 2160·2019-08-26 13:52
閱讀 427·2019-08-26 13:24
閱讀 2489·2019-08-26 12:20