C/С++ Macro для нахождения максимум двух чисел без использования тройного оператора

Я наткнулся на вопрос интервью, который гласит:

"Напишите простой макрос 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);
}
+5
19 сент. '14 в 4:08
источник поделиться
6 ответов

Используйте логические операции для получения 0 или 1, а затем просто добавьте их:

#define max(x,y) (((int)((x)<(y)) * (y)) + ((int)((y)<=(x)) * (x)))
+26
19 сент. '14 в 4:20
источник
#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);
};

решение просто для удовольствия: > скомпилировано с помощью С++ 14

взорвется, если x, y имеет разные типы

+5
19 сент. '14 в 5:03
источник

#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
19 сент. '14 в 4:12
источник
#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. (таким образом, самый старший бит).

Я предполагаю, что это то, что они ищут, поскольку оно не использует сравнения.

+2
19 сент. '14 в 4:51
источник

Все, так много хороших решений. У меня есть еще один, использующий то, что booleans преобразуют в ноль и одно:

#define CONDITION(c, t, f) (c * t + (1 - c) * f)
#define MAX(a, b) CONDITION(a > b, a, b)

Рядом, я намеренно ALL_UPPERCASING этого злого макроса. Я бы сказал, что это фактический момент, который вы должны были затронуть в интервью.

+2
19 сент. '14 в 5:37
источник

Еще один сумасшедший подход на основе С++ 11 и небольшое изменение с добавлением объявления struct (можно использовать std::array, если библиотеки разрешены) - за все, что стоит (не так много!)...

struct Max { int n_[2]; };
#define max(x,y) (Max{(x),(y)}.n_[(x) < (y)])
+1
19 сент. '14 в 5:40
источник

Посмотрите другие вопросы по меткам или Задайте вопрос