资讯专栏INFORMATION COLUMN

js中的位运算

banana_pi / 2700人阅读

摘要:位与真真为真,其余为假和二进制位与运算由于奇数的二进制末位为,偶数为,跟的位与运算后,分别为和,因此可以用位与运算来判断奇偶数。为奇数为偶数位或假假为假,其余为真和二进制位或运算整数与的位或运算,都是本身。

前言

在平常的工作中位运算用得比较少,一般用其他更容易理解得方式去达到相同目的。在计算机内部,一切运算最终都转化成二级制运算,直接使用二级制运算执行得效率是最高的。偶尔看到一道面试题,复习一下这方面知识,先来看一下这道面试题:

var a = 10;
a ^= (1<<4) - 1;
a的值

题目先放一放,看看js中有哪些位运算。

1. 位与(&)

真真为真,其余为假

9和10二进制位与运算

      1001
    & 1010
    -------
      1000

由于奇数的二进制末位为1,偶数为0,跟1的位与运算后,分别为1和0,因此可以用位与运算来判断奇偶数。

if(n & 1) {
    console.log("n为奇数");
} else {
    console.log("n为偶数");
}
2. 位或(|)

假假为假,其余为真

9和10二进制位或运算

      1001
    | 1010
    -------
      1011

整数与0的位或运算,都是本身。浮点数不支持位运算,过程中会自动转化成整数,利用这一点,可以将浮点数与0进行位或运算即可达到取整目的。

console.log(15.22 | 0); // 15
3. 位非(~)

真为假,假为真

9二进制位非运算

    ~ 0000000000000000 0000000000001001
    -------取反
      1111111111111111 1111111111110110
    -------符号位不变,其余取反
      1000000000000000 0000000000001001
    -------加1
      1000000000000000 0000000000001010

按位非操作,首先每一位取反,然后,第一位为负数符号位保持不变,剩余取反加1就是最后结果。

4. 异或(^)

相同为假,不同为真

9和10二进制异或运算

      1001
    | 1010
    -------
      0011

可以用于交换两个整数的值,不过一般很少这么用

var a = 3, b = 5;
a ^= b;
b ^= a;
a ^= b;
console.log("a:", a); // 5
console.log("b:", b); // a
5. 有符号左移(<<)

首位符号为不动,把32位二进制数字整体往左边移动指定位数,左边超出部分被舍去,右边补0。

9二进制有符号左移5位
    9<<5
    0000000000000000 0000000000001001
    ------
    0000000000000000 0000000100100000

计算机内是这样位移计算的,实际应用计算我们可以通过公式:num * (2^n),即:9*Math.pow(2,5)

6. 有符号右移(>>)

首位符号为不动,把32位二进制数字整体往右边移动指定位数,右边超出部分被舍去,左边补0。

288二进制有符号右移5位
    9>>5
    0000000000000000 0000000100100000
    ------
    0000000000000000 0000000000001001

计算机内是这样位移计算的,实际应用计算我们可以通过公式:num / (2^n),即:288/Math.pow(2,5)

7. 无符号右移(>>>)

符号为也跟着一起移动,这样,无符号右移会把负数的二进制当成整数的二进制码

4294967296二进制无有符号右移5位
    4294967296>>>5
    1000000000000000 0000000000000000
    ------
    0000010000000000 0000000000000000
回归面试题
var a = 10;
a ^= (1<<4) - 1;

1<<4左移4位,即1*Math.pow(2, 4) == 16,则a ^= 15

10和15的异或运算
    1111
  ^ 1010
 .........
    0101

0101二进制表示5,所以a的值位5

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93266.html

相关文章

  • 由left-pad扯到JS的位运算

    摘要:原码补码和反码原码一个数在计算机中是以二进制的形式存在的,其中第一位存放符号正数为负数为。中的位运算在中按位操作符会将其操作数转成补码形式的有符号位整数。原文链接由扯到中的位运算 这个话题的由来是2016年3月份的时候 NPM 社区发生了‘left-pad’事件,不久后社区就有人发布了用来补救的,也是现在大家能用到的 left-pad 库。 最开始这个库的代码是这样的。 module....

    LeoHsiun 评论0 收藏0
  • 复习js 2

    摘要:复习表达式和运算符运算符拥有如下类型的运算符。例如十进制数字用二进制表示为,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准的数值。因此,用于布尔值时,当任何一个操作数为则返回如果操作数都是则返回。 复习js day2 表达式和运算符 运算符 JavaScript 拥有如下类型的运算符。本节描述了运算符和运算符的优先级。 赋值运算符(Assignment operators...

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

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

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

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

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

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

    jifei 评论0 收藏0

发表评论

0条评论

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