打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
交换程序
最为常见的交换程序的实现为:

void Exch2Item(int& a,int& b)

{

int tmp = a;

a = b;

b = tmp;

}



这种解法简洁实用,所谓的Hack技巧一般有两种实现:

void Exch2Item2(int& a,int& b)

{

a = a + b;

b = a - b;

a = a - b;

}



以及:

void Exch2Item3(int& a,int& b)

{

a ^= b;

b ^= a;

a ^= b;

}                                                 
/*按位异或──^
   (1)格式:x^y
   (2)规则:对应位相同时为0,不同时为1:3^9=10。
   (3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变
*/



但是当你写了个测试程序:



int main(int argc,char* argv[])

{

int a = 2;

int b = 3;



cout<<a<<".. "<<b<<endl;

Exch2Item2(a,a);

cout<<a<<" .."<<b<<endl;



return 0;

}



你会惊诧于结果:怎么交换后a的值变为0了!虽然自己和自己交换没有意义,但是不能排除没有这种可能。把这个测试用例给出来了,分析其原因也很简单:交换函数中对同一地址进行了‘减’/‘异或’操作。当然解决方案也很简单:先做判断即可。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
快速排序算法的几种实现的性能对比:递归实现和非递归实现 | 王成文的个人站点
优先队列实现原理分析
六种常见排序算法分析与实现
数据结构与算法(七)堆
C++类模板与模板类
简单的单片机外部中断程序(给P3.2管脚低电平,led会显示取反状态)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服