摘要:最近看源码,发现有用到了位运算符,以前也见过类似的用法,所以研究了下为什么这样用。按位非运算符先看看的定义位运算由否定号表示,它是中为数不多的与二进制算术有关的运算符之一。
最近看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); }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/85958.html
摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...
摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...
摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...
摘要:例如,十进制数,用二进制表示则为。按位操作符操作数字的二进制形式,但是返回值依然是标准的数值。不同为真相同为假二进制按位异或运算从左到右按位非为真,为假对每一项进行非操作,遇真则假,遇假则真。 二进制与十六进制 二进制用 0 1 表示 2= 10十六进制 前缀0x 用0123456789ABCDEF表示 2= 0x2二进制与十六进制的转换十六进制的每位 等于二进制的四位 十六进制 0x...
阅读 1265·2021-11-24 09:39
阅读 1514·2021-09-07 09:59
阅读 3479·2019-08-30 15:54
阅读 2474·2019-08-30 11:00
阅读 2668·2019-08-29 15:06
阅读 2159·2019-08-26 13:52
阅读 427·2019-08-26 13:24
阅读 2488·2019-08-26 12:20