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