谈谈使用过的几款咖啡机

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
H1B/绿卡遥遥无期
又不想回国
来东南亚最大的互联网集团工作?
码农求职神器Triplebyte:
不用海投
内推多家公司面试
坐标湾区
Games Startup
招聘游戏开发工程师
游戏初创公司招聘工程师、UIUX Designer和游戏策划
查看: 873|回复: 5
收起左侧

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

[复制链接] |试试Instant~ |关注本帖
我的人缘0
traceroute_su 发表于 2014-9-27 07:13:29 | 显示全部楼层 |阅读模式
  此人我要顶:
 
0% (暂未有人投票) 【我投】
  此人我要踩:
 
0% (暂未有人投票) 【我投】

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

您需要 登录 才可以下载或查看,没有帐号?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的话,是无法正确显示的和计算的,这个办法很好解决这个问题。。。
但是。。。我没看懂。。。能不能给小弟讲讲。。。。先谢谢了


上一篇:&lt;T extends Comparable&lt;? super T&gt;&gt; 啥意思啊
下一篇:CC150有没有比较好的题解
我的人缘0
largecat 发表于 2014-9-27 09:00:07 | 显示全部楼层
  此人我要顶:
 
0% (暂未有人投票) 【我投】
  此人我要踩:
 
0% (暂未有人投票) 【我投】
这里 (~(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,不会变成正的。


回复 支持 反对

使用道具 举报

全球28万学生4.7分推荐
我的人缘0
shaoyiwenet 发表于 2014-9-27 13:32:53 | 显示全部楼层
  此人我要顶:
 
0% (暂未有人投票) 【我投】
  此人我要踩:
 
0% (暂未有人投票) 【我投】
largecat 发表于 2014-9-27 09:00
这里 (~(left ^ right) & (left ^ (left + right))) < 0 说明(~(left ^ right) & (left ^ (left + right)) ...

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

使用道具 举报

我的人缘0
shaoyiwenet 发表于 2014-9-27 13:32:56 | 显示全部楼层
  此人我要顶:
 
0% (暂未有人投票) 【我投】
  此人我要踩:
 
0% (暂未有人投票) 【我投】
largecat 发表于 2014-9-27 09:00
这里 (~(left ^ right) & (left ^ (left + right))) < 0 说明(~(left ^ right) & (left ^ (left + right)) ...

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

使用道具 举报

我的人缘0
largecat 发表于 2014-9-27 14:02:09 | 显示全部楼层
  此人我要顶:
 
0% (暂未有人投票) 【我投】
  此人我要踩:
 
0% (暂未有人投票) 【我投】
因为Long.MIN_VALUE是100000.....(一个1后面跟着全都是0)

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

使用道具 举报

我的人缘0
 楼主| traceroute_su 发表于 2014-9-27 16:10:20 | 显示全部楼层
  此人我要顶:
 
0% (暂未有人投票) 【我投】
  此人我要踩:
 
0% (暂未有人投票) 【我投】
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






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

custom counter

GMT+8, 2018-6-24 17:22

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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