review
位运算符即按照内存中的位来操作数值,因此具有更好的性能。位运算符有:
~
按位非(NOT)&
按位与(AND)|
按位或(OR)XOR
按位异或(XOR)<<
左移>>
右移>>>
无符号右移
位运算符属于最基层的操作,在数值逻辑的处理过程中,应该优先被考虑。
practice
来看一个case:
题1
1 | 在一个整数数组中,除了1个数只出现1次,其他每个数都出现2次,找出这个数。 |
解
考虑到这篇文章的主题,聪明的你应该已经想到了,这里使用异或
,能最优雅的解决该问题。
1 | /** |
用es6 再简洁一点
1 | var singleNumber = function(nums) { |
注意:二进制中负数是以二进制补码存储
步骤如下:
- 首先求该负数的绝对值码;
- 求二进制反码,即将0替换为1,1替换为0;
- 在得到的二进制码反码上加1;
如:-18
- 绝对值码:0000 0000 0000 0000 0000 0000 0010 0010
- 二进制反码:1111 1111 1111 1111 1111 1111 1101 1101
- 加上1:1111 1111 1111 1111 1111 1111 1101 1110
下面,来个升级版:
题2
1 | 在一个整数数组中,除了2个数只出现1次,其他每个数都出现2次,找出这2个数。 |
Analysis
- 同上,这个依然要用到异或;
- 那么,如何将最终的结果(即:所求之数的异或结果)分解出来呢
解
1 | /** |
plus
位操作的使用也能让代码变得更优雅:
- ~location.indexOf(‘baidu.com’) // 只有-1按位非为0
- Math.random()*100 ^ 0 // 得到0~100(不含100)之间的随机数
- ~new Date // 加时间戳