Ответ 1
return !((x & 0x80000000) >> 31 | !x);
isPositive
- return true
if x > 0
, иначе false
Пример: isPositive(-1)
Правовые операции: !
~
&
^
|
+
<<
>>
Макс. ops: 8
Примечание. Условные утверждения не разрешены.
inline bool isPositive(int32_t x) {
return ???;
}
return !((x & 0x80000000) >> 31 | !x);
int isPositive(int x) {
return !((x&(1<<31)) | !x);
}
x&(1<<31
- проверить, является ли число отрицательным.
!x
- проверить, является ли число нулевым.
Число положительно, если оно не отрицательно и не равно нулю.
int isPositive(int x)
{
return (!(x & 0x80000000) & !!x);
}
Проиграть со знаком бит: sign(~n)
: 1, если n >= 0
Чтобы избавиться от случая, когда n
равно 0: sign(~n + 1)
: 1, если n > 0 или n = MIN_INT
Итак, нам нужен случай, когда обе функции возвращают 1:
return ((~n & (~n + 1)) >> 31) & 1;
Почему бы не использовать XOR (^)
?
Попробуйте это,
{
return ((x>>31)&1)^(!!x);
}
Он может иметь дело с футляром 0.
Предполагая представление двойного дополнения (не всегда случай!), это может быть достигнуто путем проверки того, установлен ли самый старший бит (в этом случае число отрицательно).
Обратите внимание, что в следующем коде используются незаконные операции (+
, *
и -
), но они предназначены только для ясности и независимости платформы. Если вы знаете больше о своей конкретной платформе, например. что 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;
Если вы работаете с числовой системой, использующей MSB в качестве знакового бита, вы можете сделать:
int IsPositive(int x)
{
return (((x >> 31) & 1) ^ 1) ^ !x;
}
Не выполнял ассемблер некоторое время, но, насколько я помню, первая цифра в слове представляет собой отрицательное значение, например. 1000 - -8, следовательно, если старший бит равен 1, это число отрицательно. Итак, ответ !(x>>31)
У вас есть еще один вариант:
int is_positive = (0&x^((0^x)&-(0<x)));
Это просто a (0 и min (0, x)).
Тест здесь
int isPositive (int x)
{
return ( ! (x & ( 1 << 31 ) ) );
}
Он вернет 1, если задано no is + ve и возвращает 0, если задано no isveve
в этой функции мы получили знаковый бит, если это 1, это означает, что нет -ve, поэтому мы возвращаем 0 и если знаковый бит равен 0, значит, число равно + ve, поэтому мы возвращаем 1.
int x,len;
x = 0x0fffffff;
len = (sizeof(x) * 8) - 2;
if ((x>>len))
printf("Negative\n");
else
printf("Positive\n");
X будет либо int, либо char (интегральный тип).
return! ((x → 31) и 1); Это проверка MSB.