#include <iostream>
#include <climits>
 
/* Отражаем 1 в 0 и 0 в 1 */
int flip(int bit) {
    return 1^bit;
}
 
/* Возвращаем 1, если число положительное, и 0, если отрицательное*/
int sign(int a) {
    return flip((a >> (sizeof(int) * CHAR_BIT - 1)) & 0x1);
}
 
int getMax(int a, int b) {
	int c = a - b;
 
	int sa = sign(a); // если a >= 0, то 1, иначе 0
	int sb = sign(b); // если a >= 1, то 1, иначе 0
	int sc = sign(c); // зависит от переполнения a - b
 
	/* Цель: найти k, которое = 1, если а > b, и 0, если a < b.
	 * если a = b, k не имеет значения */
 
	// Если у а и b равные знаки, то k = sign(a)
	int use_sign_of_a = sa ^ sb;
 
	// Если у a и b одинаковый знак, то k = sign(a - b)
	int use_sign_of_c = flip(sa ^ sb);
 
	int k = use_sign_of_a * sa + use_sign_of_c * sc;
	int q = flip(k); // отражение к
 
	return a * k + b * q;
}
 
int main() {
	std::cout << getMax(4, 5);
	return 0;
}