如何在不使用if或for的情况下判断一个数字是正数、负数还是零?

6
我希望在微处理器中实现标志位和零标志的设置。因此,我需要编写一个函数来查找数字是正数、负数还是零,但不使用iffor循环,而且只允许使用布尔和位运算符号。我已经完成了以下操作,但我该如何为zero条件进行实现呢?
int status (int x) {
    int sign = (x >> 31);
    return sign;
}

有什么建议吗?

2
给我每个条件的三个输出值。 - raj raj
1
还相关的内容:https://dev59.com/cW865IYBdhLWcg3wQMID - jogojapan
1
@jogojapan 这是关于位运算符的。 - Navnath Godse
1
@jogojapan...我知道这个问题和你的建议很相似,但他只想使用布尔运算符。 - Navnath Godse
1
@jogojapan 没错,你说得对。 - noufal
显示剩余9条评论
3个回答

7
以下内容将在x为负数时返回-1,在x为零时返回0,在x为正数时返回1
int status (int x) {
  int sign = (x > 0) - (x < 0); 
  return sign;
}

很好的建议,但是OP需要通过布尔值实现,你有什么建议吗? - Grijesh Chauhan
/dev/null 我不能使用“大于(>)”或“小于(<)”运算符。 - noufal

2
这对您的目的是否足够?
int status(int val)
{
    int minus = (val&0x80000000)&&TRUE;
    int pos = (val&0x7FFFFFFF)&&(!(val&0x80000000));
    int r = 0 - minus + pos;
    return r;
}

0

试试这个

int status (unsigned no) {
  int sign = 0;

   // If Zero             // If -Ve = -1 OR If +Ve = -2
   (sign = ( no | 0 )) && ( sign = (~( ( (no << 1) >> 1 ) == no)) );

   // If +Ve
   (sign == -2) && (sign = 1);

  return sign;
}

我明白了,这很简单。可以通过以下方式轻松完成:return ((!!x) | (x >> 31)); - noufal
@noufal...是的,你的代码是正确的,但它不具备可移植性。它只能在32位系统上运行。 - Navnath Godse
@Navanth 是的...没错.. 但在这里对我来说没关系.. 你知道否则该怎么做吗? - noufal
@noufal...你可以使用sizeof运算符,如下所示:return ((!!x) | (x >> (sizeof(int)*8) - 1));但是你需要为相应的平台编译以获得正确的结果。 - Navnath Godse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接