前言

JS中有位运算符:与( & )、或( | )、按位取反(~)、异或( ^ )、左移位( << )、右移位( >> )。下面就具体来说说这些位运算符。

十进制转二进制

首先,需要明白一点,JS进行位运算符时,都是将操作数转换为二进制在进行的,毕竟是按位运算。一般情况下,都是十进制转二进制,遇到其他进制,也可以先转化为十进制,然后在转为二进制。
… 128 64 32 16 8 4 2 1
我一般转换二进制的时候,先是将2的幂次方值依次从右往左列出,然后看看如何能让最少的几位数相加之和与所转换值相等,比如13,那么应该是8+4+1,然后就在对应的数字下面写1,结果如下表


128

64

32

16

8

4

2

1


1

1

0

1

然后又在空白处填上0,第一位非0数字位前的就不用填充了,那么最后得到13的二进制数为:1101。

与( & )

规则: 两位同为“1”,结果为“1”,否则为0。
13 & 6 ==> 4

操作数/结果

8

4

2

1

13

1

1

0

1

6

0

1

1

0

结果

0

1

0

0

或( | )

规则: 两位中任意一位为“1”,结果为“1”,否则为0。
13 | 6 == > 15

操作数/结果

8

4

2

1

13

1

1

0

1

6

0

1

1

0

结果

1

1

1

1

按位取反( ~ )

规则: 操作数求负再减一。
~13 == > -14
实际的计算步骤:

  1. 将13(原码)转二进制:00001101
  2. 按位取反:11110010
  3. 发现符号位(即最高位)为1,表示负数,除符号位的其他位取反:1001101
  4. 末位加1取其补码:1001110
  5. 补码转换为10进制:-14

异或 ( ^ )

规则: 两位不同,结果为“1”,否则为0。
13 ^ 6 == > 11

操作数/结果

8

4

2

1

13

1

1

0

1

6

0

1

1

0

结果

1

0

1

1

左移位 ( << )

规则:将数值向左移动若干位,用0补足。
13 << 2 == > 52

过程

32

16

8

4

2

1

原始数

1

1

0

1

左移1位

1

1

0

1

左移2位

1

1

0

1

右移位(>>)

规则: 将数值依次右移动若干位,如果超出界限,则去掉。
13 >> 2 == > 3

过程

8

4

2

1

溢出省略位

溢出省略位

原始数

1

1

0

1

右移1位

1

1

0

1

右移2位

1

1

0

1

补充——原码、反码、补码

原码:一个数的二进制,其中最高位表示符号位:1为负数,0为正数。
反码:在原码的基础上,除符号位外,依次取反。
补码:在反码的基础上,按正常加法操作,加1。