关闭

腾讯一笔试题

标签: 腾讯iostream汇编语言c
942人阅读 评论(3) 收藏 举报
分类:

最近看了腾讯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

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

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

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

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:29764次
    • 积分:505
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:22篇
    • 译文:0篇
    • 评论:9条
    文章存档
    最新评论