专栏首页ypw0x3f3f3f3f

0x3f3f3f3f

在算法竞赛中,我们常常需要用到一个“无穷大”的值,对于我来说,大多数时间我会根据具体问题取一个99999999之类的数(显得很不专业啊!)

在网上看别人代码的时候,经常会看到他们把INF设为0x7fffffff,奇怪为什么设一个这么奇怪的十六进制数,一查才知道,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择。

但是更多情况下,0x7fffffff并不是一个好的选择,比如在最短路径算法中,我们使用松弛操作:

if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v]; 1 如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了!

准确来说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”这个条件,它会变成了一个很小的负数。

更进一步的,如果有一个数能够满足“无穷大加无穷大依然是无穷大”,那么就更好了!

前阵子无意中看到了一个不一样的取值,INF=0x3f3f3f3f,这时我又郁闷了,这个值又代表的是什么?于是我去寻找答案,发现这个值的设置真的很精妙!

0x3f3f3f3f的十进制是1061109567,是109级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于109的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。 另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。

最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处: 如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a)),方便又高效,但是当我们想将某个数组全部赋值为无穷大时,就不能使用memset函数而得自己写循环了,因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0(一般我们只有赋值为-1和0的时候才使用它)。现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [蓝桥杯][算法提高VIP]不同单词个数统计

    用户7727433
  • ICPC Pacific Northwest Regional Contest 2019 C D E M 题解

    D 标准签到,因为只能加跟除,所以 A =< B 时就只能执行加法操作 然后 A > B 时,只能对A 不是偶数变偶数然后除 就这样子一直到 A < B。然...

    用户7727433
  • 2020 第十一届蓝桥杯校内模拟赛c/c++ B组

    1.求约数 水题:96 2.求内存 水题:15488 3.求含数字9的个数 水题:544 4.2019个结点的树最多有多少个叶子节点 水题:201...

    用户7727433
  • 大数据-MapReduce基本介绍

    MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思 想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场...

    cwl_java
  • LeetCode79|平方数之和

    给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。

    后端Coder
  • 使用StartSSL为你的服务器加密

    目前越来越流行https的网站了,作为个人如何给自己的web服务器升级呢?不要错过免费的StartSSL。

    zhangheng
  • libev版优化, 实现多端口多用户, 同端口多用户(多密码).

    用户1202364
  • “计算机版新冠病毒”出现了,恶意程序会窃取密码删除数据!

    安全研究团队MalwareHunterTeam人员发现了至少五种以COVID-19(新型冠状病毒肺炎)为主题的恶意病毒程序,其中四种危害严重,一种为测试或恶作剧...

    数据猿
  • 基于OpenCV 的车牌识别

    车牌识别是一种图像处理技术,用于识别不同车辆。这项技术被广泛用于各种安全检测中。现在让我一起基于OpenCV编写Python代码来完成这一任务。

    小白学视觉
  • Xshell不能连接SSH的解决

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 异常处理汇总-开发工具 http:/...

    逸鹏

扫码关注云+社区

领取腾讯云代金券