异或运算(^)交换数据

在很多的情况下我们需要交换两个变量的值,常用且直观的方法是

void swap(int a,int b){
    int temp = a;
    a = b;
    b = temp;
}

我们还可以用另外一种一眼看上去很卧槽的方法,那就是异或运算,当然这种方法只能用于整数型运算。

void swap(int a,int b){
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

//or like this
void swap(int *x,int *y){
    *x = *x ^ *y;
    *y = *x ^ *y;
    *x = *x ^ *y;
}

嗯??????我擦......为啥

下图是布尔运算的代数表

布尔代数的运算表

由表可得:

x^x^y == y   因为 x^x = 0 ,0^y = y;  这就是为啥能交换的原因

假设int a0=10,b0=20;

//计算过程
{
    a0 = a0 ^ b0;    //step 1
    b0 = a0 ^ b0;    //step 2
    a0 = a0 ^ b0;    //step 3
}

 

step1:    int  temp_a = a0 ^ b0;    //不管这是个啥

step2:    int  temp_b = a0 ^ b0;

        ∵ a0 = temp_a

        ∴  temp_b = a0 ^ b0 ^ b0;     =>   b = a0;

setp3:     a0  = a0 ^ b0 ;

        ∵  a0还是等于temp_a ,b0 已经等于a0

        ∴  a0=tamp_a ^ b0 ;   =>  a0 = a0 ^ b0 ^ a0;    =>  a  = b0;

交换完毕! 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值