免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5342 | 回复: 9
打印 上一主题 下一主题

关于用异或交换整型变量的值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-05 21:01 |只看该作者 |倒序浏览
如下:

#define swap(a, b) (a) ^= (b), (b) ^= (a), (a) ^= (b)

有人说当 (a == b) && (a != 0) && (b != 0) 时,(a ^ b) == 0,所以这种情况下不能用异或交换。我愣是想了半天没明白到底怎么不行了。至少我测试发现就算 a == b,且不为 0,结果仍然是正确的。请教各路高手,那些说不行的人,是否在忽悠人?

论坛徽章:
0
2 [报告]
发表于 2007-10-05 21:08 |只看该作者
应该是没有问题的
只是这种办法没有办法交换非整形数据

论坛徽章:
0
3 [报告]
发表于 2007-10-06 00:27 |只看该作者
原帖由 ypxing 于 2007-10-5 21:08 发表
应该是没有问题的
只是这种办法没有办法交换非整形数据

嗯,只能交换整型~

论坛徽章:
0
4 [报告]
发表于 2007-10-06 00:29 |只看该作者
没问题

论坛徽章:
0
5 [报告]
发表于 2007-10-06 09:31 |只看该作者
原帖由 ypxing 于 2007-10-5 21:08 发表
应该是没有问题的
只是这种办法没有办法交换非整形数据


变通一下,也可以用来交换浮点数。比如,假设 float 和 int 等长,程序可以这么写:
  1. {
  2.   float x = 12.34;
  3.   float y = 56.78;
  4.   swap( *(unsigned int*)&x, *(unsigned int*)&y );
  5. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2007-10-06 10:31 |只看该作者
这样可不大好呀,
不能确切的得到你想要的结果
不具可移植性

原帖由 whyglinux 于 2007-10-6 09:31 发表


变通一下,也可以用来交换浮点数。比如,假设 float 和 int 等长,程序可以这么写:
{
  float x = 12.34;
  float y = 56.78;
  swap( *(unsigned int*)&x, *(unsigned int*)&y );
}

论坛徽章:
0
7 [报告]
发表于 2007-10-06 11:01 |只看该作者
没问题,仔细分析一下异或运算的特点就可以了。
a^b^b=a^(b^b)=a^0=a;
a^b^a=(a^a)^b=0^b=b;

论坛徽章:
0
8 [报告]
发表于 2007-10-06 11:05 |只看该作者
原帖由 ypxing 于 2007-10-6 10:31 发表
这样可不大好呀,
不能确切的得到你想要的结果
不具可移植性



移植性问题是一个很容易就可解决的问题。比如,如果写 C 程序,可使用 C99 标准中规定的 uint32_t 代替程序中的 unsigned int。另外,还可直接使用一些定义了宽度类型的跨平台的库,或者自己定义这样的类型。

论坛徽章:
0
9 [报告]
发表于 2007-10-06 12:35 |只看该作者
当年看到这所谓"不用额外变量交换两个变量"的题目,还不太在意, 想想作为智力锻炼也还挺不错的. 但是现在看到有人竟然在项目里也煞有介事的用,我实在是有话要说:
1, a=a+b, b=a-b, a=a-b; a+b 越界了怎么办?
2, a=a^b, b=b^a, a=b^a; a和b是指针怎么办, ^操作对操作子是有要求的. *a^*b在GCC编译会报错.

加个中间变量有什么不好?
#define swap(a,b) ({typeof(a) temp; temp=a; a=typeof(a)(b); b=typeof(b)(temp)})

论坛徽章:
0
10 [报告]
发表于 2007-10-06 12:49 |只看该作者
原帖由 hibernator 于 2007-10-6 12:35 发表
当年看到这所谓"不用额外变量交换两个变量"的题目,还不太在意, 想想作为智力锻炼也还挺不错的. 但是现在看到有人竟然在项目里也煞有介事的用,我实在是有话要说:
1, a=a+b, b=a-b, a=a-b; a+b 越界了怎么办?
...

说得不错。不过最后给出的解决方案太依赖GCC的特性了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP