一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 479|回复: 5
收起左侧

[算法题] 求问大家一道位操作判断溢出的代码,没看懂精华,请教

[复制链接] |试试Instant~ |关注本帖
traceroute_su 发表于 2014-9-27 07:13:29 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
public static boolean willAdditionOverflow(Long left, Long right) {
        if (right < 0 && right != Long.MIN_VALUE) {
            return willSubtractionOverflow(left, -right);
        } else {
            return (~(left ^ right) & (left ^ (left + right))) < 0;
        }
    }
    public static boolean willSubtractionOverflow(Long left, Long right) {
        if (right < 0) {
            return willAdditionOverflow(left, -right);
        } else {
            return ((left ^ right) & (left ^ (left - right))) < 0;
        }
    }

这代码是可以用判断long的溢出的。效果非常棒。因为在64位机器里,一旦有数字大于max val的话,是无法正确显示的和计算的,这个办法很好解决这个问题。。。
但是。。。我没看懂。。。能不能给小弟讲讲。。。。先谢谢了

largecat 发表于 2014-9-27 09:00:07 | 显示全部楼层
这里 (~(left ^ right) & (left ^ (left + right))) < 0 说明(~(left ^ right) & (left ^ (left + right))) 的结果是负的,也就是结果的首位是1

也就是~(left ^ right) 和 (left ^ (left + right))的结果,首位均为1

~(left ^ right)的结果首位为1,说明left ^ right的首位为0,也就是说,left和right,首位一样,也就是left和right同正或同负。因为只有两个正数相加或者两个负数相加才有可能溢出。

(left ^ (left + right))的结果首位为1,说明left和left+right的首位不同,left为负时,left+right为正,若left为正,则left+right为负。两个正数相加得负数,或者两个负数相加为正数,不就是溢出了吗

要把Long.MIN_VALUE单独提出来处理的原因是-Long.MIN_VALUE仍然是Long.MIN_VALUE,不会变成正的。


回复 支持 反对

使用道具 举报

shaoyiwenet 发表于 2014-9-27 13:32:53 | 显示全部楼层
largecat 发表于 2014-9-27 09:00
这里 (~(left ^ right) & (left ^ (left + right))) < 0 说明(~(left ^ right) & (left ^ (left + right)) ...

-Long.MIN_VALUE仍然是Long.MIN_VALUE,不会变成正的。  这是为什么?
回复 支持 反对

使用道具 举报

shaoyiwenet 发表于 2014-9-27 13:32:56 | 显示全部楼层
largecat 发表于 2014-9-27 09:00
这里 (~(left ^ right) & (left ^ (left + right))) < 0 说明(~(left ^ right) & (left ^ (left + right)) ...

-Long.MIN_VALUE仍然是Long.MIN_VALUE,不会变成正的。  这是为什么?
回复 支持 反对

使用道具 举报

largecat 发表于 2014-9-27 14:02:09 | 显示全部楼层
因为Long.MIN_VALUE是100000.....(一个1后面跟着全都是0)

它的补码是反码加1,就是011111....+1,还是它本身
回复 支持 反对

使用道具 举报

 楼主| traceroute_su 发表于 2014-9-27 16:10:20 | 显示全部楼层
largecat 发表于 2014-9-27 09:00
这里 (~(left ^ right) & (left ^ (left + right))) < 0 说明(~(left ^ right) & (left ^ (left + right)) ...

感觉胜读十年书 谢谢详细解释 受教了 非常感谢
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-8 08:27

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表