跳到主要内容

按位异或

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的位置翻转