有两个数A和B,现在不通过第三空间交换A和B。
首先,感谢@brayden和@kamushin的指导,之前我的理解是错误的,哈哈,留着被踩警示自己。重新补充一下自己的答案为什么用异或前需要增加判断,是为了防止异或了同一变量,示例代码如下:
void swap(int *arr, int i, int j) { if (i != j) { arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j]; } }
当i==j时,如果不加判断会出现问题,原因是arr[i]和arr[j]都是指向同一变量,直接异或会将这个变量变为0
这个题目好像很老了哦,貌似很多地方都有答案
A=A+B A:A+B B:B B=A-B A:A+B B:A A=A-B A:B B:A
这个是加法版的
a = a ^ b b = b ^ a a = a ^ b
这个是异或版的
在位运算的代数系统中,^运算中 a的逆元仍是a,类比加法 a+(-a)=0 有 a^a=0。这样想的话,位运算只是在模仿加法运算。
a=a^b 等价 a=a+b b=a^b 等价 b=a+(-b) a=a^b 等价 a=a+(-b)
if((&a) != (&b)){ a^=b^=a^=b; }//必须判断地址不同!
list($b,$a)=array($a,$b);php版...
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(5)
首先,感谢@brayden和@kamushin的指导,之前我的理解是错误的,哈哈,留着被踩警示自己。重新补充一下自己的答案
为什么用异或前需要增加判断,是为了防止异或了同一变量,示例代码如下:
当i==j时,如果不加判断会出现问题,原因是arr[i]和arr[j]都是指向同一变量,直接异或会将这个变量变为0
这个题目好像很老了哦,貌似很多地方都有答案
这个是加法版的
这个是异或版的
在位运算的代数系统中,^运算中 a的逆元仍是a,类比加法 a+(-a)=0 有 a^a=0。
这样想的话,位运算只是在模仿加法运算。
list($b,$a)=array($a,$b);
php版...