检查两个整数是否具有相同符号的最简单方法是什么?这有什么简单的按位技巧吗?
怎么了?
return ((x<0) == (y<0));
?
这是一个在C/C++中工作的版本,它不依赖于整数大小或有溢出问题(即x*y> = 0不起作用)
bool SameSign(int x, int y) { return (x >= 0) ^ (y < 0); }
当然,你可以嘲笑和模板:
templatebool SameSign(typename valueType x, typename valueType y) { return (x >= 0) ^ (y < 0); }
注意:由于我们使用exclusive或者,我们希望LHS和RHS在符号相同时不同,因此不同的检查对零.
(a ^ b) >= 0
如果符号相同则评估为1,否则为0.
我会对确定整数符号的任何按位技巧保持警惕,因为那时你必须假设这些数字是如何在内部表示的.
几乎100%的时间,整数将被存储为两个恭维,但除非您使用的是保证特定存储格式的数据类型,否则对系统内部进行假设并不是好的做法.
在两个恭维中,您可以检查整数中的最后一个(最左侧)位以确定它是否为负,因此您可以仅比较这两个位.这意味着0将具有与正数相同的符号,这与在大多数语言中实现的符号函数不一致.
就个人而言,我只是使用您所选语言的符号功能.像这样的计算不太可能存在任何性能问题.
假设32位整数:
bool same = ((x ^ y) >> 31) != 1;
稍微简洁一点:
bool same = !((x ^ y) >> 31);
我不确定我会认为"按位技巧"和"最简单"是同义词.我看到很多被假定有符号32位整数(虽然它的答案将是愚蠢的,要求签名); 我不确定它们是否适用于浮点值.
似乎"最简单"的检查是比较两个值与0的比较; 假设可以比较类型,这是非常通用的:
bool compare(T left, T right) { return (left < 0) == (right < 0); }
如果标志相反,你会得到假的.如果标志相同,你就会成真.