按位异或
2024年03月11日
一、认识
x ^ y
,会将两个十进制数在二进制下进行异或运算,然后返回其十进制下的值。
二、规则
两个位相同为0
,相异为1
三、语法
3.1 x^y
let x = 1
let y = x ^ 8
console.log(y)
运算过程
1 => 0000 0000 0000 0000 0000 0000 0000 0001
8 => 0000 0000 0000 0000 0000 0000 0000 1000
^ => 0000 0000 0000 0000 0000 0000 0000 1001
1001 => 2^3 + 2^0 = 9
3.2 x ^= y
let x = 1
x ^= 8
console.log(x)
运算过程
1 => 0000 0000 0000 0000 0000 0000 0000 0001
8 => 0000 0000 0000 0000 0000 0000 0000 1000
^ => 0000 0000 0000 0000 0000 0000 0000 1001
1001 => 2^3 + 2^0 = 9
四、场景
4.1 交换
不使用额外空间交换两个数
let x=3;
let y=5;
console.log(x.toString(2)); // 0011
console.log(y.toString(2)); // 0101
x^=y;
y^=x;
x^=y;
console.log(x,y); //此时 x=5 ; y=3
4.2 切换
切换变量 0 或 1
//常规写法
let str=2;
let flag=str?1:0;
console.log(flag);
//位运算写法
let flag=true;
flag^=1;
console.log(flag);//flag true 为0 ,false 为 1
4.3 翻转
将数值x的二进制指定位0、1翻转
/**
* x^1 或者 x^1<<0 :将x的二进制从右往左索引值为0处翻转
* x^2 或者 x^1<<1 : 将x的二进制从右往左索引值为1处翻转
* x^4 或者 x^1<<2 : 将x的二进制从右往左索引值为2处翻转
* 依次类推
*/
let x=4;// 二进制为 0100
console.log(x^2);// 0100 ^ 0010 ,结果为 0110 (6)--换句话说 0100 在从右往左索引值为1的位置翻转
let y=6;
console.log(y^2);// 二进制为 0110 ^ 0010 ,结果为 0100 (4)--换句话说 0110 在从右往左索引值为1的位置翻转
let z=8;// 二进制为 1000
console.log(z^2);// 二进制位 1000 ^ 0010 ,结果为 1010 (10)--换句话说 1000 在从右往左索引值为1的位置翻转