最简单的方法来检查两个整数是否有相同的符号?
检查两个整数是否具有相同符号的最简单方法是什么? 有没有什么简单的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( double
, float
, char
等)。