位运算是二级制数据之间的运算,由于位运算是非常底层的操作,所以执行起来非常快。适当地使用位运算可以将你的代码运行速度有进一步提升!
关于不同进制之间如何互相转换我推荐这位up主的视频
& | 逻辑与 | / |
| | 逻辑或 | / |
~ | 逻辑非 | / |
^ | 逻辑异或 | / |
<< | 左位移(空位0填充) | a<<b === a*b**2 |
>>> | 右位移(空位0填充) | / |
>> | 右位移(空位看情况填充) | a>>b === Math.floor(a/(2**b)) |
目录
1. 逻辑与 &
当此运算符左右皆是1的时候,返回结果1,其他情况返回0;例:
原式:14 & 22
转二进:1110 & 10110
在Javascript中每个数字都是int类型,也就是占32个二进制单元:
00000000 00000000 00000000 00001110
00000000 00000000 00000000 00010110
-----------------------------------
00000000 00000000 00000000 00000110
所以结果就是110,
110转十进制就是6
2. 逻辑或 |
当此运算符左右有任何一个是1,运算结果就是1
还是拿14 和 22举例
原式:14 | 22
转二进:1110 | 10110
00000000 00000000 00000000 00001110
00000000 00000000 00000000 00010110
-----------------------------------
00000000 00000000 00000000 00011110
所以运算结果是11110,
转回十进制是30
3. 逻辑非 ~
这个运算符是一种取反的运算符,1变成0,0变成1,只有一个数字参与运算。
例如:逻辑非 52
~ 52
~52
二进制:~110100
放进int类型的数据单元中
00000000 00000000 00000000 00110100
取反:
11111111 11111111 11111111 11001011
11111111 11111111 11111111 11001011
转换成十进制就是负53
相同地,把负53再次取反就变回52了
4. 逻辑异或 ^
当运算符左右不相同时返回1,其他情况返回0
举例: 985 ^ 211
985 ^ 211
985转二进:1111011001
211转二进:11010011
放进int类型的数据单元中
00000000 00000000 00000011 11011001
00000000 00000000 00000000 11010011
-----------------------------------
00000000 00000000 00000011 00001010
把1100001010转换成十进制:778
5. 数据左移(空位补0) <<
和前面四个运算符不同,这个运算符直接往左或往右移动二进制数据
当数据左移过多导致超出此数据单元时,舍弃超出的那部分数据
手算公式a<<b === a*b**2
例子:将985左移三位
985 << 3
985转二进:1111011001
/
00000000 00000000 00000011 11011001
↙↙↙↙↙↙↙ 最后的空位用0填充
00000000 00000000 00011110 11001000
/
1111011001000转十进制是7880
例子2: 将15 左移2位
15 << 2
先把15转换成二进制
00000000 00000000 00000000 00001111
左移2位后
00000000 00000000 00000000 00111100
//
111100转换成十进制:60
6. 数据右移(空位补0) >>>
和数据左移操作符的执行逻辑差不多,只是方向变了
15 >>> 1
先把15转换成二进制
00000000 00000000 00000000 00001111
右移一位后
00000000 00000000 00000000 00000111
超出数据存储单元的1舍弃
//
111转十进制 7
-3 >>> 2
转二进制 :
11111111 11111111 11111111 11111101
右移2位
00111111 11111111 11111111 11111111
空位补0 超出舍弃
7. 数据右移 (空位看情况填充) >>
怎么个看情况填充法?很简单,原数据的首位是1,就填充1,原数据的首位是0就填充0
手算公式:
a>>b === Math.floor(a/(2**b))
例如一段二进制数据长这样:
00001100 11001111 11010111 11110000
右移2位:
00000011 00110011 11110101 11111100
/
例如又有一段二进制数据长这样:
11111010 11111000 11111111 11111111
右移2位:
11111110 10111110 00111111 11111111