前言
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
实际的计算步骤:
- 将13(原码)转二进制:00001101
- 按位取反:11110010
- 发现符号位(即最高位)为1,表示负数,除符号位的其他位取反:1001101
- 末位加1取其补码:1001110
- 补码转换为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。