奇淫巧计之“异或“

这篇博客深入探讨了异或操作的特点,从浅层的相同取1、相反取0,到利用异或巧妙地交换数值。文中通过LeetCode的算法题「消失的数字」和「寻找单身狗」,展示了异或在解决实际问题中的应用,阐述了如何利用异或找到缺失的数字和数组中特定的元素。同时,给出了相关代码实现,帮助读者理解异或运算的威力。
摘要由CSDN通过智能技术生成

异或的特点

浅层特点

异或操作无非就是相同取1,相反取0,具体来说,就是比较连个整数的二进制表示形式,按位比较,对应位相同则取0,对应位相反则取1。上述就是比较浅显的认识。

深层特点

在刚开始学习C语言时,大概都会碰到交换两个数这个算法。其中一种解法就是用异或,代码如下。

int main()
{
   
	int x = 10;
	int y = 20;

	x = x^y;
	y = x^y;
	x = x^y;
	
	return 0;
}

代个数更容易理解,比如x=1,y=2,x^y=3,此时3与2异或得到1,3再与1异或就得到2。

那么,由此是不是可以推断出,当3个数参与异或,其中有2个数相同,结果就是那个不同的数。紧接上面的例子,1与2异或,接着再和2异或,结果就是1(不同的数)。将这个结论推广到n个数,即n个数参与异或运算,只要有成对的数字出现,那么异或的结果就不会出现这个数。

leetcode算法题举例

消失的数字

面试题 17.04. 消失的数字
思路1:利用异或。先将0~n异或,然后在和缺少一个数的数组异或。这样出现两次的数字异或之后就会“消失”,剩下的就是缺少的那个数。

int missingNumber(int* nums, int numsSize){
   
    int i=0,t=0;
    for(i=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Schuyler Hu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值