Проверьте, является ли число x положительным (x> 0) ТОЛЬКО с помощью побитовых операторов в C - PullRequest
16 голосов
/ 12 октября 2010

isPositive - вернуть true, если x > 0, в противном случае false

Пример: isPositive(-1)

Юридические операции: ! ~ & ^ | + << >>

Макс. Операции: 8

Примечание: условные выражения не допускаются.

inline bool isPositive(int32_t x) {
  return ???;
}

Ответы [ 12 ]

19 голосов
/ 12 октября 2010
int isPositive(int x) {
   return !((x&(1<<31)) | !x);
}

x&(1<<31 - для проверки, является ли число отрицательным.

!x - для проверки, является ли число нулевым.

Число положительное, если оно не отрицательноеа не ноль.

11 голосов
/ 12 октября 2010
return !((x & 0x80000000) >> 31 | !x);
10 голосов
/ 12 октября 2010
int isPositive(int x)
{
 return (!(x & 0x80000000) & !!x); 
}
3 голосов
/ 15 сентября 2012

Почему бы не использовать XOR (^)?

Попробуйте это,

{
    return ((x>>31)&1)^(!!x); 
}

Он хорошо справляется с делом 0

3 голосов
/ 12 октября 2010

Давайте поиграем со знаком: sign(~n): 1, если n> = 0

Чтобы избавиться от случая, когда n равно 0: sign(~n + 1): 1, если n> 0 или n = MIN_INT

Итак, мы хотим, чтобы обе функции возвращали 1:

return ((~n & (~n + 1)) >> 31) & 1;
1 голос
/ 12 октября 2010

Предполагая представление дополнения до двух (не всегда!), Это может быть достигнуто путем проверки, установлен ли самый старший бит (в этом случае число является отрицательным).

Обратите внимание, что следующий код использует недопустимые операции (+, * и -), но они предназначены только для ясности и независимости от платформы. Если вы знаете больше о вашей конкретной платформе, например, что int является 32-битным числом, соответствующие константы могут быть заменены их числовым значением.

// Will be 1 iff x < 0.
int is_neg = (x & (INT_MAX + 1)) >> (CHAR_BIT * sizeof(int) - 1);
// Will be 1 iff x != 0.
int is_not_zero = !!x;
return !is_neg & is_not_zero;
0 голосов
/ 30 ноября 2015

У вас есть другая опция:

int is_positive = (0&x^((0^x)&-(0<x)));

Это просто (0 & min (0, x)).

Тест здесь

0 голосов
/ 08 сентября 2011

возврат! ((X >> 31) & 1);Это проверить MSB.

0 голосов
/ 19 ноября 2010
int x,len;
x = 0x0fffffff;
len = (sizeof(x) * 8) - 2;

if ((x>>len))
 printf("Negative\n");
else
 printf("Positive\n");

X будет либо int, либо char (целочисленный тип).

0 голосов
/ 12 октября 2010

int isPositive (int x)

{

 return ( ! (x & ( 1 << 31 ) ) );

}

Он вернет 1, если задано no is + ve, и вернет 0, если дано no is -ve

в этой функции мы получили знаковый бит, если он равен 1, это означает, что no is -ve, поэтому мы возвращаем 0, а если знаковый бит равен 0, это означает, что число равно + ve, поэтому мы возвращаем 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...