最近看了腾讯05年的一个笔试题,感觉还好,发上来
题目是这样说的:请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
刚刚开始看到这个题目没有什么思路,后来细细想,突然间有用汇编或是其他语言做它的冲动,这样就可以避开大于、小于和if了,哈哈,不过还是老老实实的用c做吧^_^
有个人给了一个答案是:
#include "stdafx.h"
#include <string.h>
#include <iostream>
using namespace std;
#define Cmp(x,y) compare(x,y)
int compare( int a, int b)
{
a^=(1<<31); b^=(1<<31);
int i=31;
while ((i^-1) && !((a&(1<<i))^(b&(1<<i)))) i--;
return (i^-1)?(((a>>i)&1)?1:-1):0;
}
int _tmain()
{
int c;
c = Cmp(5,4);
cout<<c<<endl;
return 0;
}
我看了看,看着那个按位异或“^”的符号头疼,算起来真麻烦,于是便不看了。
自己想了想,于是用了abs函数和switch语句,通过abs(a-b)和a-b的差就可以得出结果,感觉比它的好理解
前些天又跟学长讨论,学长说可以转换为条件运算符“ ? : ”和“==”,他给了我一个除法的运算的实现:
#define max(a,b) (a==b)?a:((a-b)/abs(a-b)==1?a:b))
后来我突发奇想,其实我的abs减法也可以用条件运算符的于是把自己代码简化了:
#define max(a,b) (abs(a-b)-(a-b))==0?a:b
事后再想想,其实那个“==”也可以去掉了,相减只能得到0或负数,非零即为真,所以可以简化为:
#define max(a,b) (abs(a-b)-(a-b))?b:a
这样应该是最简单的结果了吧?
如果谁有更简单的分享一下哦^_^
感觉做一些题,找个人讨论一下,既有乐趣,又有挑战性,还可以感受到成功的喜悦,爽,哈哈