位运算的异或,与

当想要去交换两个不同值得数字时,不止可以用申请变量的方式

int temp=a;

a=b;

b=temp;

还可以使用位运算的方式 a=a^b; b=a^b;a=a^b;

原因:异或的操作就是不进制式运算,就是当两个数异或的时候都是1就变成0,但是前面不进位。异或的有意思的地方是,a^a=0,所以当两个数异或后出现的二进制数为1的地方,就是他们两的数都不一样的地方。

提取一个int类型数的最右侧的1,方法是让这个数和他的相反数做与运算,比如

      a=01101110010000

    ~a=10010001101111

~a+1=10010001110000

a&(~a+1)=00000000010000

这样就找到了最右边的1;

当一个数组里面有两个数出现了奇数次,其他都是偶数次应该怎么找到这两个数并且打印呢;

先让数组里的每一项进行异或运算,因为相同的两个数字异或是0;所以最后留下的就是两个不同的数字a^b, eor=a^b;

再去获得eor的这个数最右边的1的位置,为什么获得1的位置,因为两个数异或出现1,说明在这一位上,两个数一个是1一个是0,如果两个都是1或者两个都是0在这一位相加就变成0了,所以找到这一位是1的异或位置。

rigthone=eor&(~eor+1)

得到这一位后,再让数组里面的每一项去和这个rightone去做异或运算,因为刚刚我们知道再这一位上这两个数异或是1所以肯定是一个是0一个是1,我们把数组中的数字根据这一位分开,再这一位上是1的是一类,是0的是一类,当数组里的每一项和rightone做&运算不是0的时候说明再这一位是1,

eor`=eor`^符合这个条件的每一项,偶数项消失,最后留下的就是奇数次数字其中的一个,让eor`再去和eor做^运算,得到的就是另一个奇数次数字.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值