腾讯一笔试题

最近看了腾讯05年的一个笔试题,感觉还好,发上来

题目是这样说的:请定义一个宏,比较两个数ab的大小,不能使用大于、小于、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

这样应该是最简单的结果了吧?

如果谁有更简单的分享一下哦^_^

感觉做一些题,找个人讨论一下,既有乐趣,又有挑战性,还可以感受到成功的喜悦,爽,哈哈

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值