如何在不使用 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 【问题描述】:我想在微处理器中实现符号和零标志设置。所以我需要编写一个函数来查找数字是正数、负数还是零,而不使用if
或for
循环,并且只允许使用布尔运算符和位运算符。我做了以下。但是如何针对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 (>)
或less than (<)
运算符..【参考方案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 >> 31));
就可以轻松搞定
@noufal...是的,您的代码工作正常,但不可移植。它只适用于 32 位。
@Navanth 是的...这是正确的.. 但在这里对我来说没问题.. 你知道该怎么做吗?
@noufal...您可以使用sizeof
运算符作为-> return ((!!x) | (x >> (sizeof(int)*8) - 1));
但您需要针对各个平台进行编译才能获得正确的结果。以上是关于如何在不使用 if 或 for 的情况下找到一个数字是正数、负数还是零? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 numpy 或 zip 的情况下找到两个列表之间的欧几里得距离?