Я пытался определить, есть ли переполнение при вычитании двух чисел из 32 бит.Мне дали следующие правила:
Can only use: ! ~ & ^ | + << >>
* Max uses: 20
Example: subCheck(0x80000000,0x80000000) = 1,
* subCheck(0x80000000,0x70000000) = 0
No conditionals, loops, additional functions, or casting
Пока у меня есть
int dif = x - y; // dif is x - y
int sX = x >> 31; // get the sign of x
int sY = y >> 31; // get the sign of y
int sDif = dif >> 31; // get the sign of the difference
return (((!!sX) & (!!sY)) | (!sY)); // if the sign of x and the sign of y
// are the same, no overflow. If y is
// 0, no overflow.
Теперь я понимаю, что не могу использовать вычитание в реальной функции (-), поэтому вся моя функция бесполезнав любом случае.Как я могу использовать метод, отличный от вычитания, и определить, есть ли переполнение, используя только побитовые операции?