一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
大家好,我是程序员_随心,希望能够通过自己的学习输出给你带来帮助。
题目:
交换以下两个值:
let a = 2;
let b = 7;
解法有三:
方法一:建立额外变量
let a = 2;
let b = 7;
let c = a;
a = b;
b = c;
console.log(a); // 7
console.log(b); // 2
方法二:利用es6的解构赋值
let a = 2;
let b = 7;
[a , b] = [b, a];
console.log(a); // 7
console.log(b); // 2
方法三:利用按位异或(^)操作符
let a = 2;
let b = 7;
a ^= b;
b ^= a;
a ^= b;
console.log(a); // 7
console.log(b); // 2
剖析算法三,即按位异或
第一二中方式想必大家都很清楚,那么我们来详细的讲解下第三种方式。
这里首先我们讲解下什么是按位异或:
按位异或用托字符(
^)表示,有两个操作数,以下为按位异或的真值表
| 第一个数的位 | 第二个数的位 | 结果 |
|---|---|---|
| 1 | 0 | 1 |
| 1 | 1 | 0 |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
ok,我们讲解下上面👆🏻结果的原理:
let a = 2;
let b = 7;
// 交换两个值的步骤
a ^= b;
b ^= a;
a ^= b;
// step1 a ^= b;
a 2 = 0000 0000 0000 0000 0000 0000 0000 0010
b 7 = 0000 0000 0000 0000 0000 0000 0000 0111
----------------------------------------------
res = 0000 0000 0000 0000 0000 0000 0000 0101
// 此时a为 5
// step2 b ^= a;
b 7 = 0000 0000 0000 0000 0000 0000 0000 0111
a 5 = 0000 0000 0000 0000 0000 0000 0000 0101
----------------------------------------------
rea = 0000 0000 0000 0000 0000 0000 0000 0010
// 此时b为 2
// step3 a ^= b;
a 5 = 0000 0000 0000 0000 0000 0000 0000 0101
b 2 = 0000 0000 0000 0000 0000 0000 0000 0010
----------------------------------------------
res = 0000 0000 0000 0000 0000 0000 0000 0111
// 此时a为 7
// 至此我们可以清楚看到交换过来了。
最后
您的每一个点赞及评论都是对我坚持写作最大的支持! 另外希望各位朋友和我交流讨论,如有不对的地方,更希望批评指正!
我是程序员_随心,希望能够通过自己的学习输出给你带来帮助。