利用位运算来判断两个数是否异号可能会出现的问题

阅读: 评论:0

利用位运算来判断两个数是否异号可能会出现的问题

利用位运算来判断两个数是否异号可能会出现的问题

通常情况下判断两个数是否异号最直接的方法是

bool cmp(int a, int b)
{return a*b<0;
}

这种方法其实存在一个潜在问题,如果a*b的值超过了int类型的最大值,就会越界出错,而且是非常有可能发生的一件事

为了减少这个问题发生的可能,要把接收数字的容器换为long long。有没有能从根本上解决这个问题的方法呢?我在网上找到了一种利用位运算的方法

方法来源贴点这里

bool cmp(int a, int b)
{return (a^b)<0
}

这种利用位运算的方法巧妙的避免了第一中方法可能会出现的越界问题
但是也存在一个特别大的问题——不能正确的处理0

如果a和b中任意一个数字是0,那么根据异或运算符的特性,结果是另一个数字的值。这意味着另一个数为负数的结果会完全错误

比如在int为16位的机器中,二进制a=1111 0000 0000 0000,b=0,按照第一种方法可以得到正确的返回值false。

而按照位运算的方法会得到结果1111 1111 1111 0000,它对应的十进制小于零,返回值会为true。
要解决这个问题,只需要稍微修改代码即可:

bool cmp(int a, int b)
{if(a&b)return (a^b)<0;else return false;
}

这样就可以无论怎么样的情况都能正确判断数字是否异号了

本文发布于:2024-02-01 00:37:24,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170671904432557.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:可能会   个数
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23