免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: flw
打印 上一主题 下一主题

一个小问题,大家竞答一下。 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2003-02-05 11:52 |只看该作者

一个小问题,大家竞答一下。

按位异或运算可以避免溢出

(伪代码)
a=a xor b
b=a xor b
a=a xor b

论坛徽章:
0
22 [报告]
发表于 2003-02-05 12:16 |只看该作者

一个小问题,大家竞答一下。

用+ -法产生溢出不会对结果产生影响。
因为做+ - 法产生的溢出在做+ 产生了
那么在做- 时同时就比会发生借位,互相抵消了。
这是由计算机的特性产生了效果。

如在16位计算机上(方便说明)
int 类型的数为 2 个字节,假设有如下两个数。
符号位不影响运算。
a = 0xff01;
b = 0x0f02 ;
a = a+b;       // a 得 0xe03,进位的1被丢掉了。(丢到虚无中了)。
b = a - b;     // 0xe03 - 0x0f2 = 0xff01 发生了借位,(从虚无中借的)。
a = a - b;    //  0xe03 - 0xff01 = 0xf2  同上。

这种方法只有+ - 可以,因为两个数加只会有1bit溢出。

论坛徽章:
0
23 [报告]
发表于 2003-02-05 22:41 |只看该作者

一个小问题,大家竞答一下。

楼上说的极是,但虽然不影响结果,但总的说来不够严谨,
所以还是不可取的!

论坛徽章:
0
24 [报告]
发表于 2003-08-02 16:09 |只看该作者

一个小问题,大家竞答一下。

a=a xor b
b=a xor b
a=a xor b
JohnBull说的这个快 做算法都用xor不用直接+

论坛徽章:
0
25 [报告]
发表于 2006-07-21 09:42 |只看该作者

回复 10楼 flw 的帖子

有三种方法把?

论坛徽章:
0
26 [报告]
发表于 2006-07-21 13:28 |只看该作者
提不出更多办法,测了一下三个方法

  1. void swap1(int* a,int* b)
  2. {
  3.         *a=*a+*b;
  4.         *b=*a-*b;
  5.         *a=*a-*b;
  6. }

  7. int c;
  8. void swap2(int* a,int* b)
  9. {
  10.         c=*b;
  11.         *b=*a;
  12.         *a=c;
  13. }

  14. void swap3(int* a,int* b)
  15. {
  16.         *a^=*b;
  17.         *b^=*a;
  18.         *a^=*b;
  19. }
复制代码


还是传统的方法快,异或慢一点点,加减法就慢了很多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP