无穷大 0x7ffffff 0x3f3f3f3f

概念解释

单词:infinite的意思是无穷大
INF就是infinite的简写,表示无穷大常数

0x表示十六进制,后面的3f3f3f3f表示一个十六进制数

 

0x7ffffff

如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,取0x7ffffff作为无穷大,这是32-bit int的最大值,如果这个无穷大只用于一般的比较,比如求最小值时min变量的初值,更多的情况下选择0x3f3f3f3f

1.很多时候我们并不只是单纯拿无穷大作比较,而是会运算后再做比较,
例如在大部分最短路径算法中都会使用松弛操作:
if(d[u]+w[u][v]<d[v])
d[v]=d[u]+w[u][v];
若u,v,之间没有边,那么w[u][v]=INF,INF=0x7ffffff,  那么d[u]+w[u][v]会溢出而变成负数,松弛操作便出错了
 
2.不能满足无穷大加上无穷大依然是无穷大,而且会发生灾难性的错误

 

0x3f3f3f3f

鉴于以上两点,需要一个更好的INF来替代0x7ffffff,最严谨的办法是对无穷大
进行特别处理而不是找一个很大的常量来代替他(或者说模拟它),但是这样会让编程过程麻烦
最精巧的无穷大常量取值是0x3f3f3f3f

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

    如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),
    但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),
    就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),
    我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,
    如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!
    所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

#define INF 0x3f3f3f3f

 

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值