今天看到的这个题,觉得有意思,就做了一下。。。
思路:
如果有两个数,要么相等,要么不相等;如果两数不相等,
那它们就存在差值的关系(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算了。。。
转载于:https://www.cnblogs.com/Random/archive/2007/04/15/714404.html