如何在不使用 if 或 for 的情况下找到一个数字是正数、负数还是零? [复制]

Posted

技术标签:

【中文标题】如何在不使用 if 或 for 的情况下找到一个数字是正数、负数还是零? [复制]【英文标题】:How do I find whether a number is positive, negative or zero without using if or for? [duplicate] 【发布时间】:2013-05-19 15:27:54 【问题描述】:

我想在微处理器中实现符号和零标志设置。所以我需要编写一个函数来查找数字是正数、负数还是零,而不使用iffor 循环,并且只允许使用布尔运算符和位运算符。我做了以下。但是如何针对zero 条件实现它?

int status (int x) 
    int sign = (x >> 31);
    return sign;

有什么建议吗?

【问题讨论】:

给我每个条件的三个输出值... 也相关:***.com/questions/3912375/… @jogojapan 用于按位运算符。 @jogojapan...我知道这个 Q. 与您的建议相似,但他只想使用布尔运算符。 @jogojapan 是的......你是对的...... 【参考方案1】:

以下将返回 -1 负值,0 零,1 正值 x

int status (int x) 
  int sign = (x > 0) - (x < 0); 
  return sign;

【讨论】:

+ 不错的建议,但是 OP 需要通过布尔值,你有什么建议吗? devnull 我不能使用greater than (&gt;)less than (&lt;) 运算符..【参考方案2】:

这足以满足您的目的吗?

int status(int val)

    int minus = (val&0x80000000)&&TRUE;
    int pos = (val&0x7FFFFFFF)&&(!(val&0x80000000));
    int r = 0 - minus + pos;
    return r;

【讨论】:

【参考方案3】:

试试这个

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 &gt;&gt; 31));就可以轻松搞定 @noufal...是的,您的代码工作正常,但不可移植。它只适用于 32 位。 @Navanth 是的...这是正确的.. 但在这里对我来说没问题.. 你知道该怎么做吗? @noufal...您可以使用sizeof 运算符作为-> return ((!!x) | (x &gt;&gt; (sizeof(int)*8) - 1)); 但您需要针对各个平台进行编译才能获得正确的结果。

以上是关于如何在不使用 if 或 for 的情况下找到一个数字是正数、负数还是零? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 numpy 或 zip 的情况下找到两个列表之间的欧几里得距离?

如何在不使用 NA() 的情况下强制 Excel 图表跳过 0?或由 IF 返回“空”

如何在不使用 for 循环的情况下从列表中删除元素?

如何在不使用 for 循环的情况下填充二维数组?

在不更改应用样式的情况下更改 QSpinBox 箭头大小

如何在不使用pip或conda安装的情况下链接Selenium等库?