通过仅使用C中的按位运算符来检查数字x是否为正(x> 0)

时间:2010-10-12 07:15:39

标签: c bit-manipulation

isPositive - 如果true则返回x > 0,否则false

示例:isPositive(-1)

法律操作:! ~ & ^ | + << >>

Max ops:8

注意:不允许使用条件语句。

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

12 个答案:

答案 0 :(得分:19)

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

x&(1<<31是检查数字是否为负数。

!x是检查数字是否为零。

如果数字不是负数而不是零,则数字为正数。

答案 1 :(得分:11)

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

答案 2 :(得分:10)

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

答案 3 :(得分:3)

让我们玩符号位:sign(~n):1如果n> = 0

要摆脱n为0时的情况:sign(~n + 1):1如果n&gt; 0或n = MIN_INT

所以,我们想要两个函数都返回1的情况:

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

答案 4 :(得分:3)

为什么不使用XOR (^)

试试这个,

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

它可以很好地处理0案例。

答案 5 :(得分:1)

假设有两个补码表示(并非总是如此!),这可以通过测试是否设置最高有效位来实现(在这种情况下,数字是负数)。

请注意,以下代码使用了非法操作(+*-),但这些仅用于清晰度和平台独立性。如果您对自己的特定平台有更多了解,例如: 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;

答案 6 :(得分:0)

如果您使用使用MSB作为标志位的数字系统,您可以执行以下操作:

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

答案 7 :(得分:0)

很长一段时间没有完成汇编程序,但据我记得,单词中的第一个数字代表负值,例如1000是-8,因此如果最高有效位为1,则该数字为负。所以答案是!(x>>31)

答案 8 :(得分:0)

您还有另一种选择:

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

它只是一个(0&amp; min(0,x))。

测试here

答案 9 :(得分:-1)

int isPositive(int x)

{

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

}

如果给定no为+ ve,则返回1,如果给定no,则返回0是-ve

在这个函数中我们得到了符号位,如果它是1则表示不是-ve所以我们返回0 如果符号位为0,则表示数字为+ ve,因此我们返回1.

答案 10 :(得分:-1)

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

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

X将是int或char(积分类型)。

答案 11 :(得分:-2)

返回!((x>&gt;&gt; 31)&amp; 1); 这是为了检查MSB。