码迷,mamicode.com
首页 > 其他好文 > 详细

定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 以及 不用 第三个数,交换 a,b的值

时间:2015-03-05 14:52:46      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:算法   面试   

无意中 一篇博文,介绍这个问题,引起了我的兴趣。

博文中 介绍了 三种方法:

1.

#define max(a,b) ((((a)-(b))&(1<<31))?(b):(a))

2.

#define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a))

3

#define max(a,b) (((abs((a)-(b)))==((a)-(b)))?(a):(b)) 

第一种方法 和第二种方法 的原理都是一样的,就是 根据 (a) - (b) 的结果 的 符号位 来判断 的,但是 忽略了 类型的问题,在不同的机型上 int 可以是 16 位 或者 32 位,

long 可以是 32 位 或者 64位 ,用 1<<31 或者 0x80000000   和  (a) - (b) 来进行 & 运算 都是 不合适的。


第三种方法正好解决了 上面的问题。但是 忽略了 浮点型问题。


所以 最好的方法 是 将 abs 换成 fabs

#define max(a,b) (((fabs((a)-(b)))==((a)-(b)))?(a):(b)) 


下面 来说另一个话题: 假设 有 int a = 7 , int b = 8 ,不用 第三个数 来 交换 a,b

答案:

a = a + b;
b = a - b;
a = a - b;




定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 以及 不用 第三个数,交换 a,b的值

标签:算法   面试   

原文地址:http://blog.csdn.net/fuming0210sc/article/details/44081389

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!