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

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

示例: isPositive(-1)

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

Max 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) :如果n> = 0则为1

要摆脱n为0时的情况: sign(~n + 1) :如果n> 0或n = MIN_INT,则为1

所以,我们想要两个函数返回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; 

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

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

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

你有另一种选择:

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

它只是一个(0和min(0,x))。

在这里测试

int isPositive(int x)

{

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

}

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

在这个函数中,我们得到符号位,如果它是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(积分类型)。

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