fork(11) download
  1. #include <iostream>
  2.  
  3. /* Отражаем 1 в 0 и 0 в 1 */
  4. int flip(int bit) {
  5. return 1^bit;
  6. }
  7.  
  8. /* Возвращаем 1, если число положительное, и 0, если отрицательное*/
  9. int sign(int a) {
  10. return flip((a >> 31) & 0x1);
  11. }
  12.  
  13. int getMax(int a, int b) {
  14. int c = a - b;
  15.  
  16. int sa = sign(a); // если a >= 0, то 1, иначе 0
  17. int sb = sign(b); // если a >= 1, то 1, иначе 0
  18. int sc = sign(c); // зависит от переполнения a - b
  19.  
  20. /* Цель: найти k, которое = 1, если а > b, и 0, если a < b.
  21. * если a = b, k не имеет значения */
  22.  
  23. // Если у а и b равные знаки, то k = sign(a)
  24. int use_sign_of_a = sa ^ sb;
  25.  
  26. // Если у a и b одинаковый знак, то k = sign(a - b)
  27. int use_sign_of_c = flip(sa ^ sb);
  28.  
  29. int k = use_sign_of_a * sa + use_sign_of_c * sc;
  30. int q = flip(k); // отражение к
  31.  
  32. return a * k + b * q;
  33. }
  34.  
  35. int main() {
  36. std::cout << getMax(4, 5);
  37. return 0;
  38. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
5