最简单的方法来检查两个整数是否有相同的符号?

检查两个整数是否具有相同符号的最简单方法是什么? 有没有什么简单的button技巧来做到这一点?

这是一个在C / C ++中工作的版本,它不依赖整数大小或溢出问题(即x * y> = 0不起作用)

bool SameSign(int x, int y) { return (x >= 0) ^ (y < 0); } 

当然,你可以挖掘和模板:

 template <typename valueType> bool SameSign(typename valueType x, typename valueType y) { return (x >= 0) ^ (y < 0); } 

注意:由于我们使用的是独占性的,所以当符号相同时,我们希望LHS和RHS不同,因此不同的检查是零。

怎么了

 return ((x<0) == (y<0)); 

 (a ^ b) >= 0 

如果符号相同,则评估为1,否则为0。

我会谨慎的确定整数的符号,因为那你必须假设这些数字是如何在内部表示的。

几乎100%的时间,整数将被存储为两个赞美 ,但是,除非您使用保证特定存储格式的数据types,否则对系统的内部进行假设是不好的做法。

在二的赞美,你可以检查整数的最后(最左边)位,以确定它是否为负,所以你可以只比较这两个位。 这意味着0与正数具有相同的符号,这与大多数语言中实现的符号函数不一致。

就个人而言,我只是使用您所选语言的标志function。 像这样的计算不会有任何性能问题。

假设32位整数:

 bool same = ((x ^ y) >> 31) != 1; 

稍微简洁一点:

 bool same = !((x ^ y) >> 31); 

我不太确定我会认为“比特伎俩”和“最简单”是同义词。 我看到很多答案是假设签名的32位整数(虽然要求无符号是愚蠢的)。 我不确定他们是否适用于浮点值。

似乎“最简单”的检查将是比较两个值如何比较0; 这是相当通用的假设types可以比较:

 bool compare(T left, T right) { return (left < 0) == (right < 0); } 

如果符号相反,你会得到错误的。 如果标志是一样的,你就会变成真的。

(整数1 *整数2)> 0

因为当两个整数共享符号时,乘法的结果总是正的。

你也可以使它> = 0,如果你想把0当作是同一个符号,不pipe怎样。

假设二进制补码算术( http://en.wikipedia.org/wiki/Two_complement ):

 inline bool same_sign(int x, int y) { return (x^y) >= 0; } 

这可以采取两个指令less于1ns在现代处理器与优化。

不假设二进制补码算术:

 inline bool same_sign(int x, int y) { return (x<0) == (y<0); } 

这可能需要一个或两个额外的指示,需要更长的时间。

使用乘法是一个坏主意,因为它容易溢出。

如果(x * y)> 0 …

假设非零等。

作为一个技术说明,即使在现代架构上,点点滴滴的解决scheme也将比乘法效率更高。 它只有大约3个周期,但你知道他们说的“一分钱保存”…

就在我头顶…

 int mask = 1 << 31; (a & mask) ^ (b & mask) < 0; 

假设32位

如果(((x ^ y)&0x80000000)== 0)

…(x * y> 0)由于溢出而不好的答案

无分支C版本:

 int sameSign(int a, int b) { return ~(a^b) & (1<<(sizeof(int)*8-1)); } 

整数types的C ++模板:

 template <typename T> T sameSign(T a, T b) { return ~(a^b) & (1<<(sizeof(T)*8-1)); } 

对于任何大小的二进制补码算术的int:

 #define SIGNBIT (~((unsigned int)-1 >> 1)) if ((x & SIGNBIT) == (y & SIGNBIT)) // signs are the same 

如果(a * b <0)符号不同,则符号相同(或a或b为零)

回想我的大学时代,在大多数机器表示中,当数字是负数时,不是一个整数a 1的最左边的位,当它是正数时,是0?

不过,我想这与机器相关。

int same_sign =!((x >> 31)^(y >> 31));

if(same_sign)… else …

使用std :: signbit更好的方法如下:

 std::signbit(firstNumber) == std::signbit(secondNumber); 

它也支持其他基本types( doublefloatchar等)。