Проверка, является ли число положительным или отрицательным, используя побитовые операторы - PullRequest
30 голосов
/ 23 сентября 2010

Я могу проверить, является ли число нечетным / четным, используя побитовые операторы.Могу ли я проверить, является ли число положительным / нулевым / отрицательным без использования каких-либо условных операторов / операторов, таких как if / ternary и т. Д.

Можно ли сделать то же самое с помощью побитовых операторов и некоторого трюка в C или в C ++?

Ответы [ 15 ]

1 голос
/ 01 августа 2014
if( (num>>sizeof(int)*8 - 1) == 0 )
    // number is positive
else
   // number is negative

Если значение равно 0, то число положительное, иначе отрицательное

1 голос
/ 23 сентября 2010

Это не может быть сделано переносимым способом с битовыми операциями в C. Представления для целочисленных типов со знаком, которые допускает стандарт, могут быть намного более странными, чем вы могли бы предположить. В частности, значение со знаковым битом и, в противном случае, с нулем, не обязательно должно быть допустимым значением для типа со знаком или типа без знака, но так называемым представлением ловушек для обоих типов.

Таким образом, все вычисления с битовыми операторами, которые вы можете выполнять, могут привести к неопределенному поведению.


В любом случае, как предполагают некоторые другие ответы, это не является действительно необходимым, и сравнение с < или > должно быть достаточно в любом практическом контексте, более эффективно, легче читать ... так что просто сделайте это таким образом.

0 голосов
/ 31 октября 2013

Когда вы уверены в размере целого числа (при условии 16-битного целого):

bool is_negative = (unsigned) signed_int_value >> 15;

Когда вы не уверены в размере целых чисел:

bool is_negative = (unsigned) signed_int_value >> (sizeof(int)*8)-1; //where 8 is bits

Ключевое слово unsigned необязательно.

0 голосов
/ 31 августа 2011

Предположим, ваш номер a=10 (положительный).Если вы сдвинете a a раза, это даст ноль.

т.е.):

-10>>-10 == -1

Таким образом, вы можете объединить их в if:

if(!(a>>a))
   print number is positive
else 
   print no. is negative 
0 голосов
/ 23 сентября 2010

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

Нет теста для различия между нулем и положительным значением, за исключением прямого теста против 0.

Для проверки на негатив вы можете использовать

#define IS_NEGATIVE(x) ((x) & (1U << ((sizeof(x)*CHAR_BIT)-1)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...