异或运算 ^(xor)小解

PS:这里用 ^ 表示异或运算,用 ^ 表示幂,为了方便观察,整数的二进制序列只用4位

什么是异或运算:

        设a=1,b=3; 那么a=0001,b=0011

        a^b=0001^0011=0010,当两个数做异或运算的时候对应的位置,如果相同则为0,不同则为1,就是说1^1=0,0^0=0 但是 1^0=1;

异或运算的特性:

1: a^b=c;当c异或b时,结果还原成a

2:一个数异或自己时等于0;

3:一个数异或0的时候,结果是其本身

不使用第三个变量交换两个变量的值:

1:相加法

int a = 1, b = 3;
	a = a + b;
	b = a - b;
	a = a - b;

缺点:我们知道,int 类型是有最大值的,当两个数刚好小于最大值,但是相加则大于最大值的时候,会照成溢出而导致计算不准确。

//利用异或的特性 

2:异或法

a=a^b;
b=a^b;
a=a^b;

这里可以使用比较简单的理解方法:

a2=a1^b1; 
b2=a2^b1;        因为 a2=a1^b1,所以b2=a1^b1^b1; b1异或自己等于0,a1异或0等于自己
a1=a2^b2;        同理 a1=a2^a2^b1; 

========================================================== 

扩展:异或运算 又叫  不进位加法

设a=1,b=3;那么a=0001,b=0011

比如1+3;0001+0011 相加时,为0100

而异或是:0001^0011=0010        会发现其实是2^0次方位置相加了,但是2^1次方位置没有发生进位。

这里0001&0011=0001 <<1 =0010,这里1和3做与运算,然后再向左移一位,是a,b两个数相加该进位的位置,

0010和0010,再次异或等于 0000,再次进位  0010&0010<<1=0100,

0000和0100,再次异或 0100,再次进位 0000&0100<<1=0000,

会发现这里已经没有要进位的地方了,结果就是0100,会发现得到的结果跟最上面的加法无异,其实这就是相当于一个加法在计算机里面的模拟实现

int my_add(int a,int b)
{
    int sum=a;
    int carry=b;
    while(carry){
        int temp=sum;
        sum=sum^carry;
        carr=(temp&carry)<<1;
    }
    return sum;
}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值