Самый простой способ проверить, имеют ли два целых числа один и тот же знак? - PullRequest
60 голосов
/ 16 сентября 2008

Какой самый простой способ проверить, имеют ли два целых числа один и тот же знак? Есть ли какой-нибудь короткий побитовый трюк для этого?

Ответы [ 18 ]

1 голос
/ 02 июня 2011

версия 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));
}
1 голос
/ 16 сентября 2008

при условии 32 бит

if(((x^y) & 0x80000000) == 0)

... ответ if(x*y>0) плохой из-за переполнения

1 голос
/ 16 сентября 2008

Для любого размера целого числа с двумя дополнительными арифметиками:

#define SIGNBIT (~((unsigned int)-1 >> 1))
if ((x & SIGNBIT) == (y & SIGNBIT))
    // signs are the same
1 голос
/ 16 сентября 2008

Просто с макушки головы ...

int mask = 1 << 31;
(a & mask) ^ (b & mask) < 0;
0 голосов
/ 02 декабря 2015

Лучше использовать std :: signbit следующим образом:

std::signbit(firstNumber) == std::signbit(secondNumber);

Он также поддерживает другие основные типы (double, float, char и т. Д.).

0 голосов
/ 16 сентября 2008

если (a * b <0) знак другой, иначе знак тот же (или a или b равно нулю) </p>

0 голосов
/ 16 сентября 2008

Вспоминая мои университетские дни, в большинстве машинных представлений разве не самый левый бит целого числа 1, когда число отрицательное, и 0, когда оно положительное?

Я полагаю, что это скорее зависит от машины.

0 голосов
/ 16 сентября 2008

int same_sign =! ((X >> 31) ^ (y >> 31));

if (same_sign) ... еще ...

...