Ваш исходный код совершенно неверен, так как a | 0 == a
для всех a
, и поэтому (a|0) == (b|0)
эквивалентно a == b
.
Для со знаком a, b
, вернуть false, если они имеют противоположные знаки.Обратите внимание, что 0 считается положительным знаком, хотя -0 == 0
.Наивная имплантация приведена ниже.
bool samesign(int a, int b) {
if ((a < 0) && (b >= 0))
return false;
if ((a >= 0) && (b < 0))
return false;
return true;
}
Однако ... Существует более умное и эффективное решение, использующее всего лишь одну строку, с использованием битовых манипуляций и просто обдумыванием знакового бита (на основе дополнения до двух)цифры):
bool samesign(int a, int b) {
/* Sign bit of XOR is 1 if only one of a or b is negative. */
/* That means, signed a XOR b is negative if they have opposing signs. */
return (signed int)(a ^ b) >= 0;
}
Ожидаемые результаты должны быть:
27952 and 27952 have the same sign.
27952 and -68643 have not the same sign.
27952 and 0 have the same sign.
-68643 and -68643 have the same sign.
-68643 and 0 have the same sign.
0 and 0 have the same sign.