资讯专栏INFORMATION COLUMN

JS按位非运算符(~)及双非(~~)的使用

yagami / 1234人阅读

摘要:最近看源码,发现有用到了位运算符,以前也见过类似的用法,所以研究了下为什么这样用。按位非运算符先看看的定义位运算由否定号表示,它是中为数不多的与二进制算术有关的运算符之一。

最近看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

相关文章

  • 深入研究js运算及用法

    摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...

    zhoutao 评论0 收藏0
  • 深入研究js运算及用法

    摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...

    hlcfan 评论0 收藏0
  • 深入讲解js运算及实际用法

    摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...

    jifei 评论0 收藏0
  • 按位操作符

    摘要:将任一数值与执行按位与操作,其结果都为。中应用判断奇偶性偶数奇数按位异或规则每一位都不同,结果才为将任一数值与进行异或操作,其结果为。 位运算在算法中很有用,速度可以比四则运算快很多。 To2orTo10 JS中十进制转二进制: (val).toString(2)JS中二进制转十进制: parseInt(val, 2) JS中规定安全整数的范围是-2^53~2^53,所以大于90071...

    caiyongji 评论0 收藏0
  • websocket 二进制数据传输基础准备工作

    摘要:例如,十进制数,用二进制表示则为。按位操作符操作数字的二进制形式,但是返回值依然是标准的数值。不同为真相同为假二进制按位异或运算从左到右按位非为真,为假对每一项进行非操作,遇真则假,遇假则真。 二进制与十六进制 二进制用 0 1 表示 2= 10十六进制 前缀0x 用0123456789ABCDEF表示 2= 0x2二进制与十六进制的转换十六进制的每位 等于二进制的四位 十六进制 0x...

    LeviDing 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<