主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable, mk-cute, jzman, geek-black, awesome-green
贡献主题:https://github.com/xitu/juejin-markdown-themes
theme: juejin
highlight:
异或运算符
这是百度百科给出的解释
对于程序算法来说 归零律 1 ^ 1
输出 0 相同的输出0,恒等律 1 ^ 0
输出1
二进制异或运算
|2 |1 |0 |number| |---|---|---|---| |1 |0 |1 |5 | |1 |1 |0 |6 | |1^1=0|0^1=1|1^0=1|5^6=3 |0 |1 |1 |3 |
从这个表格可以看出来 5^6
输出结果是3
从表格看,还是比较清晰的,那么下面看一下十进制和二进制之间的关系
(为啥十进制的5转为2进制是101)
十进制转二进制
使用短除法
javascript转换方法是num.toString(2)
十进制数字转为二进制
可以通过这样的规律写出一个转换工具,方便理解
javascript BinaryToDecimalSystem = function (num) { if (typeof num === "number") { const nrArr = []; // 通过根号计算出需要除几次2 (二进制有几位) const s = Math.ceil(Math.sqrt(num)); let n = num; // 需要计算s次 for (let i = s; i >= 0; i--) { let nr = n % 2 === 0 ? 0 : 1; // 数组向后添加 nrArr.unshift(nr); // 将下一次的计算值赋值给n n = Math.floor(n / 2); } // 至于输出格式这里是数组转字符串 字符串转数字 // 也可以不用数组的unshift,可以直接+=的方式直接输出字符串 return Number(nrArr.join("")); } else { return "error"; } }; const decimal = BinaryToDecimalSystem(65); console.log(decimal); // 1000001
试了几个数字 感觉没什么异样,如果还有其他逻辑,可以一起沟通
可以通过这个方法计算出 5的二进制是101
6的二进制是110
那么二进制异或算法得出结果 011
转数字 0去掉 结果是 11
那么接下来就是将11
通过二进制转十进制的方法 得出结果3 javascript提供的方法是 var num = 11 parseInt(num,2) // 3
我们通过自己写的方法来计算一下 方便理解
二进制转十进制采用按权相加法,以1100100
为例 转换结果应该是100
同样可以通过这个逻辑写一个方法
``` javascript DecimalSystemToBinary = function (num) { if (typeof num === "number") { const toStr = num.toString(); const len = toStr.length; let count = 0; for (let i = 1; i <= len; i++) { let n = Number(toStr[i - 1]); if (n !== 0) { count += n * 2 ** (len - i); } } return count } else { return 'error' } };
const count = DecimalSystemToBinary(11); console.log(count) // 3 ```
通过这样的互相转换方法 轻易的计算出 5^6=3
例题
在使用异或运算符之前 我们可以通过自己的方法来实现这个功能
javascript var singleNumber = function (nums) { let num = nums.sort((a, b) => { return a - b; }); let n = num[0]; for (let i = 1; i < num.length; i++) { if (n === num[i]) { n = num[i + 1] || num[num.length-1]; i++ } } return n; }; const arr = [4,1,2,1,2]; console.log(singleNumber(arr)); // 4
用这种方法 又要排序 又要循环 很复杂 如果用异或运算符
的话 几行代码就搞定
javascript var singleNumber = function (nums) { let n = 0; for (let i = 0; i < nums.length; i++) { n ^= nums[i] } return n; }; const arr = [2,2,1]; console.log(singleNumber(arr)); // 4
这种写法非常简便,而且高效,看起来比较复杂 我们分开几步,一步一步看具体怎么实现的
``` javascript var singleNumber = function (nums) { let n = 0; // for (let i = 0; i < nums.length; i++) { // n ^= nums[i] // } let a = nums[0] let b = nums[1] let c = nums[2]
n = n^a // 0^2 ==> n=2 恒等率 n = n^b // 2^2 ==> n=0 归零率 n = n^c // 0^1 ==> n=1 恒等率 return n; }; const arr = [2,2,1]; console.log(singleNumber(arr)); // 1 另一种情况
javascript var singleNumber = function (nums) { let n = 0; // for (let i = 0; i < nums.length; i++) { // n ^= nums[i] // } let a = nums[0] let b = nums[1] let c = nums[2]
n = n^a // 0^1 ==> n=1 衡等律 n = n^b // 1^3 ==> n=2 交换律 n = n^c // 2^3 ==> n=1 交换律 return n; }; const arr = [1,3,3]; console.log(singleNumber(arr)); // 1
```