js中的位运算

媒介

在寻常的工作中位运算用得比较少,平常用其他更轻易明白得体式格局去到达雷同目标。在盘算机内部,统统运算终究都转化成二级制运算,直接运用二级制运算执行得效力是最高的。偶然看到一道面试题,温习一下这方面学问,先来看一下这道面试题:

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

    原文作者:wuwhs
    原文地址: https://segmentfault.com/a/1190000013607145
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞