当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《检查两个整数是否有相同符号的最简单方法?》经验,为你挑选了6个好方法。

检查两个整数是否具有相同符号的最简单方法是什么?这有什么简单的按位技巧吗?



1> Rik..:

怎么了?

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


嗯...没什么......很遗憾,我们都错过了简单的解决方案.
这假设您要将0视为与正整数相同的符号.

2> Torlack..:

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

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

当然,你可以嘲笑和模板:

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

注意:由于我们使用exclusive或者,我们希望LHS和RHS在符号相同时不同,因此不同的检查对零.



3> 小智..:
(a ^ b) >= 0

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



4> SpoonMeiser..:

我会对确定整数符号的任何按位技巧保持警惕,因为那时你必须假设这些数字是如何在内部表示的.

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

在两个恭维中,您可以检查整数中的最后一个(最左侧)位以确定它是否为负,因此您可以仅比较这两个位.这意味着0将具有与正数相同的符号,这与在大多数语言中实现的符号函数不一致.

就个人而言,我只是使用您所选语言的符号功能.像这样的计算不太可能存在任何性能问题.



5> Patrick..:

假设32位整数:

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

稍微简洁一点:

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


哦,当然.在现实生活中,我可能会使用类似的东西= Math.Sign(x)== Math.Sign(y).当人们要求时,我只是给出了邪恶的解决方案.:d
这两个代码示例总是应该总是在代码注释之前(在现实生活中)

6> OwenP..:

我不确定我会认为"按位技巧"和"最简单"是同义词.我看到很多被假定有符号32位整数(虽然它的答案是愚蠢的,要求签名); 我不确定它们是否适用于浮点值.

似乎"最简单"的检查是比较两个值与0的比较; 假设可以比较类型,这是非常通用的:

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

如果标志相反,你会得到假的.如果标志相同,你就会成真.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有