JavaScript按位运算符

    技术2022-07-13  67

    按位运算符将其操作数当做32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。

    我们主要了解的有七种,分别是:&、|、^、~、<<、>>、>>>。

    按位与运算符

    按位与 & 运算符,对两个 32 位表达式的每一位执行按位与运算。如果a 和 b 都为1 则结果为1,否则结果为0。

    aba & b000010100111
    示例:

    下面演示如何使用& 运算符:

    console.log(1 & 3); // 1

    1 & 3 的结果为1,1的二进制表示为00000001,3的二进制表示为00000011,根据 & 的规则,相同得1,不同得0,可以得出结果为 00000001,即1。

    按位或运算符

    按位或 | 运算符,只要a 和 b有一个为1,则结果为1,否则结果为0。

    aba | b000011101111
    示例:

    | 运算符和 & 运算符的区别在于,只要有一个操作数为1,结果就为1。同样是1 | 3 ,结果输出为3。

    console.log(1 | 3); // 3

    1的二进制表示为00000001,3的二进制表示为00000011,根据 | 的规则,得到00000011,转为十进制,结果为3。

    按位异或运算符

    按位异或 ^ 运算符,当 a 和 b 不相同时,结果为1,否则结果为0:

    aba ^ b000011101110
    示例:

    ^ 运算符和 | 运算符有点类似,不同在于,如果操作位都为1,则结果为0。

    console.log(1 ^ 3); // 2

    1的二进制表示为00000001,3的二进制表示为00000011,根据 ^ 的规则,得到00000010,转为十进制,结果为2。

    按位非运算符

    按位非 ~ 运算符,对位求反,将1变0,将0变1,也就是求二进制的反码。

    a~a0110
    示例:

    例如 1的二进制表示为00000001,取反得到11111110,转为十进制,得到-2:

    console.log(~1); // -2 console.log(~0); // -1 console.log(~3); // -4

    右移运算符

    右移 >> 运算符 ,使指定值的二进制所有位都右移规定的次数,对于其移动规则只需记住符号位不变,左边补上符号位即按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。

    示例:

    例如1的二进制为00000001,所以1>>1的结果为1:

    console.log(1 >> 1); // 0 console.log(8 >> 2); // 2 console.log(64 >> 2); // 16 console.log(128 >> 1); // 64

    左移运算符

    左移 << 运算符,使指定值的二进制所有位都左移规定的次数,对于其移动规则只需记住丢弃最高位,0补最低位即按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

    示例:
    console.log(1 << 1); // 2 console.log(8 << 2); // 32 console.log(64 << 2); // 256

    无符号右移

    无符号右移 >>>,该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。

    示例:
    console.log(-5 >>> 1); // 2147483645 console.log(-8 >>> -2); // 8 console.log(-24 >>> 2); // 1073741818

    动手小练习

    1.分别用七种按位运算符输出一些自定义的内容,然后有一个更进一步的认识与了解。

    2.请说出下列代码的输出结果:

    console.log(9 & 16); console.log(5 & 1); console.log(3 ^ 9); console.log(~11); console.log(36 >> 2); console.log(6 << 6); console.log(56 >>> 2);
    Processed: 0.009, SQL: 9