位运算之两数交换

快速的两数交换

按位异或 ^ : 不相同 为:1 ; 相同 为 :0 将参与运算的两操作数各对应的二进制位进行异或操作,
即只有对应的两个二进位不相同时,结果的对应二进制位才是1,否则为0。

异或运算的特点是:
如果 a^b=c,那么就有 c^b = a以及c^a=b。

例如:表达式“21 ^ 18 ”的值是7(即二进制数111)。
2110101
1810010
21^18:  00111

假设 n = 5,m = 6 
5的二进制为:101
6的二进制为:110 

n^=m = 5^=6   = 101 ^ 110 = 011 ,此时 n的二进制为:011 
m^=n = 6^=011 = 110 ^ 011 = 101 ,此时 m的二进制为:101,也正是 5的二进制数,也就是说 m ==开始的n 
n^=m = 011^=5 = 011 ^ 101 = 110 ,此时 n的二进制位:110,也正是 6的二进制数,也就是说 n ==开始的m
层次结构:A->B  B->A  A->B 正 反 正 

不得不说,这很神奇,

说下自己的思路

第一步,n^=m; 先找出 这两个数的 异或数,并赋给 n。
特别注意的是:这个异或数,就相当于 一个穿梭门。
如果有两个人 甲与乙,甲 通过穿梭门会变成乙 而乙 通过穿梭门 会变成甲。 

第二步,m^=n; m 对 异或数 进行异或运算, 正如 m 穿过 穿梭门 变成了 开始n

第三步,n^=m; 这里可以换种方式理解,因为在第一步,穿梭门的值赋给了 n ,在第二步,m 成为了 开始的n 
而这第三步 n^=m; 等价于 开始的n 穿过 穿梭门,并把值 赋给 n,所以答案显而易见,n 成为了 开始的m 
是的,交换成功,你不得不服,这牛掰的位运算。 

代码如下:


#include <stdio.h> 
int main(){
    int n,m;
    while(~scanf("%d %d",&n,&m)){
        n^=m;
        m^=n;
        n^=m;
        printf("%d %d\n",n,m);
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值