Проверьте, является ли число x положительным (x> 0) ТОЛЬКО с использованием побитовых операторов в C

isPositive - return true if x > 0, иначе false

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

Правовые операции: ! ~ & ^ | + << >>

Макс. ops: 8

Примечание. Условные утверждения не разрешены.

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

Ответы

Ответ 1

return !((x & 0x80000000) >> 31 | !x);

Ответ 2

int isPositive(int x) {
   return !((x&(1<<31)) | !x);
}

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

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

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

Ответ 3

int isPositive(int x)
{
 return (!(x & 0x80000000) & !!x); 
}

Ответ 4

Проиграть со знаком бит: sign(~n): 1, если n >= 0

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

Итак, нам нужен случай, когда обе функции возвращают 1:

return ((~n & (~n + 1)) >> 31) & 1;

Ответ 5

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

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

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

Он может иметь дело с футляром 0.

Ответ 6

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

Обратите внимание, что в следующем коде используются незаконные операции (+, * и -), но они предназначены только для ясности и независимости платформы. Если вы знаете больше о своей конкретной платформе, например. что 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;

Ответ 7

Если вы работаете с числовой системой, использующей MSB в качестве знакового бита, вы можете сделать:

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

Ответ 8

Не выполнял ассемблер некоторое время, но, насколько я помню, первая цифра в слове представляет собой отрицательное значение, например. 1000 - -8, следовательно, если старший бит равен 1, это число отрицательно. Итак, ответ !(x>>31)

Ответ 9

У вас есть еще один вариант:

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

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

Тест здесь

Ответ 10

int isPositive (int x)

{

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

}

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

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

Ответ 11

int x,len;
x = 0x0fffffff;
len = (sizeof(x) * 8) - 2;

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

X будет либо int, либо char (интегральный тип).

Ответ 12

return! ((x → 31) и 1); Это проверка MSB.