Какой самый простой способ проверить, имеют ли два целых числа один и тот же знак? Есть ли какой-нибудь короткий побитовый трюк для этого?
версия C без ответвлений:
int sameSign(int a, int b) { return ~(a^b) & (1<<(sizeof(int)*8-1)); }
Шаблон C ++ для целочисленных типов:
template <typename T> T sameSign(T a, T b) { return ~(a^b) & (1<<(sizeof(T)*8-1)); }
при условии 32 бит
if(((x^y) & 0x80000000) == 0)
... ответ if(x*y>0) плохой из-за переполнения
if(x*y>0)
Для любого размера целого числа с двумя дополнительными арифметиками:
#define SIGNBIT (~((unsigned int)-1 >> 1)) if ((x & SIGNBIT) == (y & SIGNBIT)) // signs are the same
Просто с макушки головы ...
int mask = 1 << 31; (a & mask) ^ (b & mask) < 0;
Лучше использовать std :: signbit следующим образом:
std::signbit(firstNumber) == std::signbit(secondNumber);
Он также поддерживает другие основные типы (double, float, char и т. Д.).
double
float
char
если (a * b <0) знак другой, иначе знак тот же (или a или b равно нулю) </p>
Вспоминая мои университетские дни, в большинстве машинных представлений разве не самый левый бит целого числа 1, когда число отрицательное, и 0, когда оно положительное?
Я полагаю, что это скорее зависит от машины.
int same_sign =! ((X >> 31) ^ (y >> 31));
if (same_sign) ... еще ...