为什么无穷大总是0x3f3f3f3f?

2023-05-16

转自 http://aikilis.tk/

如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。

  1. 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:
    if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
    我们知道如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了,更一般的说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”,它变成了一个很小的负数。
  2. 除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。

所以我们需要一个更好的家伙来顶替0x7fffffff,最严谨的办法当然是对无穷大进行特别处理而不是找一个很大很大的常量来代替它(或者说模拟它),但是这样会让我们的编程过程变得很麻烦。在我读过的代码中,最精巧的无穷大常量取值是0x3f3f3f3f,我不知道是谁最先开始使用这个精妙的常量来做无穷大,不过我的确是从一位不认识的ACMer(ID:Staginner)的博客上学到的,他/她的很多代码中都使用了这个常量,于是我自己也尝试了一下,发现非常好用,而当我对这个常量做更深入的分析时,就发现它真的是非常精巧了。

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

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么无穷大总是0x3f3f3f3f? 的相关文章

  • Python DeprecationWarning the imp module is deprecated in favour of importlib

    报错 E PyCharm 2018 2 5 helpers pycharm docrunner py 1 DeprecationWarning the imp module is deprecated in favour of import
  • Unity3D 编辑器调试无响应问题

    问题描述 使用 VS 在 Unity 编辑器中调试代码 xff0c 点击 VS 的 附加到 Unity xff0c Unity 编辑器按下 Play 之后 xff0c 就会一直等待并且无其他响应 xff0c 只能结束 Unity 进程 原因
  • 获取 Windows 操作系统的系统、网络、硬件、软件等信息

    Github 源码 xff1a WindowsInfo Net可执行文件 xff1a WindowsInfo Net exe 获取的信息 能获得的信息如下 xff08 系统 硬件 网络信息已打码 xff09 系统信息 计算机名 xff1a
  • 一个基于 C# 的简单的线程安全日志模块

    一个基于 C 的简单的线程安全日志模块 xff0c 它使用生产者 消费者模式 xff0c 可以在 NET Framework 和 Net Core 中使用 Github 地址 xff1a LogConsumer 使用 将 LogConsum
  • Python爬虫深造篇(一)——多线程网页爬取

    一 前情提要 相信来看这篇深造爬虫文章的同学 xff0c 大部分已经对爬虫有不错的了解了 xff0c 也在之前已经写过不少爬虫了 xff0c 但我猜爬取的数据量都较小 xff0c 因此没有过多的关注爬虫的爬取效率 这里我想问问当我们要爬取的
  • c++多态和虚函数心得

    多态性 xff08 Polymorphism xff09 是指一个名字 xff0c 多种语义 xff1b 或界面相同 xff0c 多种实现 重载函数是多态性的一种简单形式 虚函数允许函数调用与函数体的联系在运行时才进行 xff0c 称为动态
  • IntelliJ IDEA 代码检查规范QAPlug

    转自 xff1a http blog csdn net jizi7618937 article details 51500725 Avoid Array Loops 数组之间的拷贝使用System arrayCopy更加高效 byte Re
  • linux系统中rpm与Yum软件仓库

    rpm的作用 xff1a 在没有rpm软件管理之前我们在安装 升级 卸载服务程序时要考虑到其他程序 库的依赖关系 xff0c 所以在进行安装 校验 卸载 升级等操作时的难度就非常之大 rpm机制则为就是为了解决这些问题而设计的 xff0c
  • Nokov使用说明(Windows系统)

    Nokov使用说明 第一步 镜头硬件调节1 连接镜头 xff0c 打开Seeker软件 xff08 以下简称软件 xff09 2 放置标定框3 调节镜头4 调焦1 xff09 调节后环 xff1a 光圈调到最大2 xff09 调节前环 xf
  • 计算机的存储器层次结构以及一二三级缓存的区别

    hibernate 一级缓存和二级缓存的区别 xff1a 主要的不同是它们的作用范围不同 一级缓存是session级别的 也就是只有在同一个session里缓存才起作用 xff0c 当这个session关闭后这个缓存就不存在了 而二级缓存是
  • Mac安装java反编译工具JD-GUI提示需要安装jdk1.8+解决方案

    一 下载 Java Decompiler JD Java Decompiler http java decompiler github io 二 当打开JD GUI软件时候 xff0c 会弹出以下错误 xff0c 见图示 xff1a 而自己
  • Docker命令详细说明

    Docker命令详细说明 docker help 查看docker帮助 使用方法 xff1a docker 命令选项 命令 参数 docker dameon help docker help v version config 61 dock
  • udev 规则文件介绍

    1 配置文件 udev的配置文件位于 etc udev 和 lib udev xff08 开头的是注释 xff09 udev 的主配置文件是 etc udev udev conf 它包含一套变量 xff0c 允许用户修改 udev 默认值
  • ATSAMV7Xult板卡调试Nuttx系统------NuttX模拟器SIM的的编译和调试

    NUTTX的模拟环境的编译和调试 xff1a 由于开发团队硬件资源紧张 xff0c 因此大家调试时可以使用模拟器来进行一些任务的开发和调试 参考 nuttx 7 17 configs sim readme txt介绍的操作方法 xff1a
  • C语言中,int、char、float、double各占多少字节

    https zhidao baidu com question 619738052995674092 html 只是数据类型不同而已 xff0c 在c语言中数据类型不同 xff0c 占的内存字节数不同 xff0c 所以表示数据大小不一样 i
  • 第一天做LeetCode 19.1.10

    为了备战蓝桥杯 xff0c 今天第一天做LeetCode xff0c 就做了一道题花了半个小时 xff0c 期间有各种错误 xff0c 深深的感受到自己连菜鸡都算不上 题目 xff1a 给定一个数组nums xff0c 与目标值target
  • 麻将通用胡牌算法详解(拆解法)

    1 背景 前几天刚好有项目需要胡牌算法 xff0c 查阅资料后 xff0c 大部分胡牌算法的博客都是只讲原理 xff0c 实现太过简单 xff0c 且没有给出测试用例 然后就有了下面的这个胡牌算法 xff0c 我将从算法原理和算法实现两部分

随机推荐