不用if、while、for、switch等语句及系统函数,实现求两数中的最大数的函数

      今天看到的这个题,觉得有意思,就做了一下。。。

思路:
            如果有两个数,要么相等,要么不相等;如果两数不相等,
那它们就存在差值的关系(1和5的差值是4,-2和3的差值是5)。
两数如果相减的话,那么就会得出它们的差值:

c=a-b

如果c为负数,那么a<b
如果c为正数,那么a>b
于是,现在就可以通过c的符号位来判断哪个数大了。
当然,要先取得c的符号位才行(1或者0),
用以下操作实现:

符号位=!((c&0x80000000)<<1==(c&0x80000000))

这个操作应该不难,有点C语言基础的都能看懂嘛~~就不细说了。

因为我现在要实现这么一个操作:

如果a<b,max=b;
如果a>b,max=a;

由于得到了符号位,就可以这样做:

如果是正数,那么max=a-0;
如果是负数,那么max就等于a减去这个负数,
这样就相当于把一个指向a的指针,移了|c|个单位,指向b。

所以,就要得到a的减数(0或它自身),最简单的实现方法就是:

减数=减数*符号位;

即,c=c*!((c&0x80000000)<<1==(c&0x80000000))

最后,a减去一个c,就能得到最大的数了。。。


函数代码部分(c++):

int GetMax(int a,int b)
{
 int c;
 int max;
 c=a-b;
    c=c*!((c&0x80000000)<<1==(c&0x80000000));
    max=a-c;
 return max;
}


8过有个缺点就是,该程序只能在32位机上可以正确运行,
因为c言语里面没有循环左移,所以取符号位的时候有点生硬,
虽然可以嵌入汇编,但既然是写算法就写纯c算了。。。

posted @ 2007-04-15 19:17  随机  阅读(998)  评论(0编辑  收藏  举报