国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > [置顶] 定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 以及 不用 第三个数,交换 a,b的值

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

来源:程序员人生   发布时间:2015-03-18 10:02:21 阅读次数:2985次

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

博文中 介绍了 3种方法:

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))

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

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


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


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

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


下面 来讲另外一个话题: 假定 有 int a = 7 , int b = 8 ,不用 第3个数 来 交换 a,b

答案:

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




生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生