车版热帖:大家对买豪车怎么看

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推多家公司面试
[Google级团队]:实时大数据分析领域践行者
北京/深圳-大数据/搜索/机器学习职位
日志易机器大数据行业践行者Web/大数据/机器学习等职位-北京or深圳
把贵司招聘信息放这里
查看: 844|回复: 5
收起左侧

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

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

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

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

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)) ...

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

使用道具 举报

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

关闭

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

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2018-4-23 23:35

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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