1.位操作基础
位操作一共分为6种
符号 | 描述 |
& | 与 |
| | 或 |
^ | 异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
1.1.& 按位与
两个位都为1时,结果才为1, 有0则为0
1.2 | 按位或
两个位都为0时,结果才为0,有1则为1
1.3 ^ 按位异或
不同则为0,相同则为1
1.4 按位取反
1变0 0变1
1.5 << 左移运算符
将a各二进制位全部左移b位后得到的值,左移越界丢弃,低位补0
例 9 << 4 =144
9的二进制形式为 0000 0000 0000 0000 0000 0000 0000 1001
9 << 4 = 0000 0000 0000 0000 0000 0000 0000 1001 0000
实际上左移以相当于乘以2,可用来开2的n次方
1.6 >> 右移运算符
将a各二进制位全部右移b位后得到的值。溢出最右边的值就被丢弃
例 9 >> 2 = 2
9的二进制形式为 0000 0000 0000 0000 0000 0000 0000 1001
9 << 4 = 0000 0000 0000 0000 0000 0000 0000 0000 0010
实际上右移相当于除以2的n次方,向下取整
二.部分应用及leetcode举例
1.x & (x - 1) 用于消去x最后一位的1
x = 1100
x - 1 = 1011
x & (x - 1) = 1000
应用1. leetcode15(判断N是否是2的N次幂)
思路:如果N是2的幂次,则满足两个条件
1.N>0;
2.N的二进制只有一位1
所以可以用N&(N-1)把N中的唯一的一个1消去,如果返回0则表示是2的幂次
应用2(判断二进制中1的个数)
思路: 不断用 X&(X-1)消去X的最后一位1,消去的位数则表示二进制中1的个数
2.a ^ b ^ b = a
应用1.Leetcode136(只出现一次的数字)
思路:利用异或的特性
1.交换律 a^b^c <==>a^c^b
2.任何数异或0位任何数
3.相同的数异或为0
例子: var a = [2,3,2,4,4] 2 ^ 3 ^ 2 ^ 4 ^ 4等价于 2 ^ 2 ^ 4 ^ 4 ^ 3 => 0 ^ 0 ^3 => 3