C / C ++宏,用于在不使用三元运算符的情况下查找最多两个数字

时间:2014-09-19 04:08:51

标签: c++ c c-preprocessor

我遇到了一个面试问题,内容如下:

“编写一个简单的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);
}

6 个答案:

答案 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)])