一、位运算符将它的操作数视为32位元的二进制串(0和1组成),而非十进制八进制或十六进制数。

【示例】十进制数字9用二进制表示为1001,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准的JavaScript数值。

二、位运算符

Operator Usage Description
按位与 AND a & b 在a,b的位表示中,每一个对应的位都为1,则返回1,否则返回0
按位或 OR a | b 在a,b的位表示中,每一个对应的位都为0,则返回0
按位异或 XOR a ^ b 在a,b的位表示中,每一个对应的位,两个不相同则返回1,相同则返回0
按位非 NOT ~ a 反转被操作数的位
左移 shift a << b 将二进制串向左移动b位,右边移入0
算术右移 a >> b 把a的二进制表示向右移动b位,丢弃被移出的所有位
无符号右移
(左边空出位用0填充)
a >>> b 把a的二进制表示向右移动b位,丢弃被移出的所有位,并把左边空出的位都填充为0
【示例】1 & 2的结果为
答案:0
解析:1=0001 2=0010 按位与运算,同为1才为1,否则返回0
【示例】0xff ^ 33 的结果是:
A. 220
B. 221
C. 222
D. 223
答案:C
解析:考察点:异或运算符、进制转换
1、^: 表示的是异或运算符 ,规则:两值同为0,不同为1
2、0xff是十六进制的255,33是十进制,先得转换成都是二进制才能进行异或运算
3、0xff表示16进制的ff, 即16*15+15 = 255,255=27+26+25+24+23+22+21+20
33=25+1 , 也就是在最高位有1,最末位也有一个1
(1)现在将它们两个2进制化表达就是:
0xff ——> 255 ——> 1111 1111
33 ——> 33 ——> 0010 0001
4、这两个进行异或运算后是 1101 1110 (二进制)
(1)二进制的1101 1110 转换为10进制就是:128+64+0+16+8+4+2+0 = 222

四、这些运算符在web开发中很少被使用,一般是我们需要在最低级别(位)上操作数字时才使用。但在某些特殊领域中,例如密码学,它们很有用。当你需要了解它们的时候,可以阅读 MDN 上的位操作符章节。

运算符类型

位逻辑运算符

一、位逻辑运算符的工作流程
1、操作数被转换为32bit整数,以位序列(0和1组成)表示。若超过32bits,则取低位32bit,如下

  1. Before: 11100110111110100000000000000110000000000001
  2. After: 10100000000000000110000000000001

2、第一个操作数的每一位都与第二个操作数的对应位组对:第一位对应第一位,第二位对应第二位,以此类推。
3、运算符被应用到每一对“位”上,最终的运算结果由每一对“位”的运算结果组合起来。

【示例】十进制数9的二进制表示是1001,十进制数15的二进制表示是1111。因此,当位运算符应用到这两个值时,结果如下
表达式 结果 二进制描述
15 & 9 9 1111 & 1001 = 1001
15 | 9 15 1111 | 1001 = 1111
15 ^ 9 6 1111 ^ 1001 = 1111
~15 -16 ~ 00000000…00001111 = 1111 1111 … 11110000
~9 -10 ~ 00000000…0000 1001 = 1111 1111 … 1111 0110

4、位运算符“非”将所有的32位取反,而值的最高位(最左边的一位)为1,则表示负数(2-补码表示法)

移位运算符

一、移位运算符带两个操作数:第一个是待移位的数,第二个是指定第一个数要被移多少位的数。
二、移位的方向由运算符来控制。
三、移位运算符把操作数转为32bit整数,然后得出一个与移位数相同种类的值。
四、移位运算符

运算符 描述 范例
<<(左移位) 将第一个操作数向左移动指定数量的位。左边移出位被抛弃。左边移出的几位被丢弃,右边多出的空位由0补齐 9 << 2产生36,因为1001移位2比特向左变为100100,它是36
>>(带符号右移) 将第一个操作数向右移动指定数量的位。右边移出位被抛弃,左边多出的空位由原值的最左边数字补齐。 9 >> 2产生2, 因为1001移位2位向右变为10,其是2。同样, -9 >> 2产生-3,由于符号被保留。
>>> (补零右移) 将第一个操作数向右移动指定数量的位。右边移出位被抛弃,左边多出的空位由0补齐。 19 >>> 2产生4,因为10011移位2位向右变成100,它是4。对非负数值,补零右移和带符号右移产生相同结果。

位运算符技巧

【见】位运算符 - 图1
一、~~常用来取整

  • 数组类型 => 纯数字
  • 字符串中带了除数字外的东西 => Number类型的0
  • bolean,true => 1, false => 0
  • 特殊类型,转化为boolean是true => 1, 转化为boolean是false => 0 | 【示例】
    - 数字类型的字符串可以转化为纯数字
    ```javascript var a=’123’; console.log(~~a); //输出123
    1. <br />- 字符串中带了其他字母,符号,或者其他除数字外的东西,一律输出 Number类型的0<br />```javascript
    2. var a='asd';
    3. console.log(~~a); //输出0

    - 任何boolen类型的,如果为TRUE则输出1,FALSE输出0;
    ```javascript var a=1==1; console.log(~~a);//输出1
    <br />- 特殊类型,转化为Boolean是true的输出1,转化为boolean是false的输出0;<br />```javascript
    var a=undefined;
    console.log(~~a);//输出0
    var b=!undefined;
    console.log(~~b);//输出1
    
    | | —- |