使用C语言用与(&)和非(~)实现异或(详解)

例:
x=4 = 0100(二进制)
y=5 = 0101(二进制)
x^y = 1=0001(二进制)

异或解释:
        对于两个二进制数字 ,若 在某一位上相同(都为0或都为1),则它们的按位异或结果该位为0; 如若不同,即 在该位上一个为0,另一个为1,则它们的按位异或结果该位为1

我们可以利用上述特性来实现按位异或的操作,具体来说:
一.将x和y进行与(&)操作结果位0100


二.

        将一的结果进行非(~)操作1011

        A.对x进行按位非(~)操作, ~x(1011
        B.对y进行按位非(~)操作, ~y(1010
        C.将上述A.和B.的结果进行按位与(&)操作, (~x & ~y)(1010
        D.对C.的结果进行非(~)操作,  ~( ~x& ~y)(0101

三.将二中A.(1011)和D.(1010)的结果进行与(&)操作,得到0001


        这时我们发现三中的结果就变成x和y直接进行异或的结果了!!!


接下来这些操作进行逐一解释:
       在上面的操作中可以看到我们对最初的x和y的不同位(既第0位)进行了标记,仔细观察一.和C.中的结果,我们发现前三位中的每一位都是不同的,但是第0位是相同的。

        这是因为我们在第一部分先对x和y进行&操作,在第二部分我们对一的结果先~在&,因为&操作不影响二进制的不同位的结果,所以1.和a.的结果只有前三位不相同,这样我们在1.和c.的结果上进行 ~ 操作这样不同位我们就都变为1了!而前三位还是不相同!!,于是在A这一步的结果下就实现了对x和y的异或操作!!

 总的来讲我们要关心哪些位不相同,将都不相同的位置操作为1相同的位置改为不相同,这样&之后得到的结果就是a和b的按位异或。

int xor(int a, int b) {
    return ~(~a & ~b) & ~(a & b);
}

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱喝酒的修狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值