导论
与 & 或 | 非 ~ 异或 ^
位运算在一些算法题里面比较常见,也是做算法必备的一个知识
与 &
同为1才为1,否则为零
- X & 0 ⇒ 0 任意数和零做与运算,结果都为零
- yyxx & 11 ⇒ xx 与n位的1做与运算,结果是最后n位,可以用来取一个数的最后多少位
- X & 1 == 0 ⇒ X是偶数,等于1则为奇数,二进制的最后一位是0则是奇数,最后一位是1则是偶数
或 |
有一个1则为1,否则为零
- 可以达到&中2的效果,将1改为零即可
- 或有一个与运算达不到的功能,就是将最后n位设置为1
异或 ^
不同为1, 否则为零
X ^ X ⇒ X
X ^ 0 ⇒ X
x ^ 1 ⇒ ~x
非 ~
取反
是一个取反的运算,也没有指定的用途,一般搭配其它的位运算符灵活使用
~的特点就是优先级相较而言是最高的
题目
这是leecode里的一道简单题,用位运算做起来是否的简洁
一个数组里面只有一个数字存在一个,其它的数字都有两个,找出只有一个的数字
更具异或的那两个特性 X ^ X⇒ 0 X ^ 0 ⇒ X 得到 X ^ X ^ Y ^ Y ^ Z ⇒ Z
代码如下
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let ans = nums[0];
for(let i = 1; i < nums.length; i++){
ans ^= nums[i];
}
return ans;
};