Rik*_*Rik 205
怎么了?
return ((x<0) == (y<0));
Run Code Online (Sandbox Code Playgroud)
?
Tor*_*ack 47
这是一个在C/C++中工作的版本,它不依赖于整数大小或有溢出问题(即x*y> = 0不起作用)
bool SameSign(int x, int y)
{
return (x >= 0) ^ (y < 0);
}
Run Code Online (Sandbox Code Playgroud)
当然,你可以嘲笑和模板:
template <typename valueType>
bool SameSign(typename valueType x, typename valueType y)
{
return (x >= 0) ^ (y < 0);
}
Run Code Online (Sandbox Code Playgroud)
注意:由于我们使用exclusive或者,我们希望LHS和RHS在符号相同时不同,因此不同的检查对零.
假设32位整数:
bool same = ((x ^ y) >> 31) != 1;
Run Code Online (Sandbox Code Playgroud)
稍微简洁一点:
bool same = !((x ^ y) >> 31);
Run Code Online (Sandbox Code Playgroud)
我不确定我会认为"按位技巧"和"最简单"是同义词.我看到很多被假定有符号32位整数(虽然它的答案将是愚蠢的,要求签名); 我不确定它们是否适用于浮点值.
似乎"最简单"的检查是比较两个值与0的比较; 假设可以比较类型,这是非常通用的:
bool compare(T left, T right)
{
return (left < 0) == (right < 0);
}
Run Code Online (Sandbox Code Playgroud)
如果标志相反,你会得到假的.如果标志相同,你就会成真.