我遇到了一个面试问题,内容如下:
“编写一个简单的C / C ++宏来查找最多两个数字而不使用std库或三元运算符”。
我需要你帮助解决这个问题。我知道这是微不足道的,但我找不到它。所以,在这里张贴。
#include<iostream>
#define max(x,y) /*LOGIC HERE*/
using namespace std;
void main()
{
int a = 98453;
int b = 66394;
cout<<max(a,b);
}
答案 0 :(得分:26)
使用布尔运算得到0或1,然后只需将它们加起来:
#define max(x,y) (((int)((x)<(y)) * (y)) + ((int)((y)<=(x)) * (x)))
答案 1 :(得分:5)
#include <iostream>
#define max(x, y) [a = x, b = y](){ if (a<b) return b; else return a; }()
int main() {
using namespace std;
int a = 10;
int b = 20;
cout << max(10, 20);
cout << max(a, b);
};
一个有趣的解决方案:&gt; 用c ++ 14编译
如果x,y有不同的类型,会爆炸
答案 2 :(得分:3)
#define max(x,y) (x+y + abs(x-y))/2
为您提供所需内容。这有效,因为abs(x-y) = max(x,y) - min(x,y)
。因此,您可以按如下方式重写表达式
(x + y) + abs(x-y) = max(x,y) + min(x,y) + max(x,y) - min(x,y)
= 2*max(x,y)
正如评论中所指出的,使用abs
可能会违反您要求的条件。
答案 3 :(得分:2)
#define max(x, y) x - ((x-y) & ((x-y) >> 31))
假设x和y为32位。
这是因为负整数的最高位是1。
因此,如果x-y为负(y大于x),则x - (x-y)= y。
如果x-y为正,则x大于y,最高有效位为零,因此x-0 = x。
31表示变量的总位数 - 1.(因此是最高位)。
我认为这是他们正在寻找的东西,因为它没有使用比较。
答案 4 :(得分:2)
#define CONDITION(c, t, f) (c * t + (1 - c) * f)
#define MAX(a, b) CONDITION(a > b, a, b)
在附近,我故意将这个邪恶的宏观机器全部包括在内。我说这是你应该在面试中提出的实际观点。
答案 5 :(得分:1)
另一种疯狂的C ++ 11方法,并使用额外的struct
声明稍作作弊(如果允许使用库,则可以使用std::array
) - 无论它有什么价值(不是很多!)...
struct Max { int n_[2]; };
#define max(x,y) (Max{(x),(y)}.n_[(x) < (y)])