在许多算法中都要用到一个常量来表示最大值,例如:寻找一个最小数,就要先设定一个值a,如果比a小,a就等于这个数;再如,最短路径中基本的松弛操作:

0

在c++中可以用memset() 来初始化数组成最大值

1
if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
计算机不会表示出“无穷大”的概念,所以我们只能以一个定值来表示“最大”。那么使用什么值呢?

对于int类型,很自然地,我们想到用 0x7f ff ff ff 。这是32-bit的int类型所能表示的最大值。int类型在内存中的形式是,除了第一位表示正负,剩下的二进制位表示数据大小,将所有位设置为1,就是int的最大值,这个值是 2^31-1=2147483647 ,是一个十位数。

20150402204748

这样做对于上文中的第一个例子,是没有问题的,因为不涉及到计算。但是如果对于后一种,就会出现数据溢出的隐患。如果这个最大值加上任何一个数,就会变成一个很小的负数。所以,我们还要满足“无穷大加上无穷大还是无穷大。”的原则。

如果使用 0x3f3f3f3f ,这个问题可以得到完美的解决。这个数字的值是 1061109567,也是一个十位数,和 0x7fffffff是一个数量级的。而且它的两倍是 2122219134 ,就满足了即使两个无穷大相加,仍然可以表示一个无穷大。

20150402205123

使用这个数还有一个好处。我们想将一个数组的数据全部置为无穷大的时候(经常用到),使用的 memset的第二个参数value是8-bit的。

value:Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned charconversion of this value.

也就是说,memset是按照8位来格式化数组的,而通过上图我们可以发现,0x3f3f3f3f的四个八位都是一样的!这样我们就可以使用memset来将数组所有值最大化,而不用使用循环了,提高了效率。

综上,将INF(最大值)设置为0x3f3f3f3f是一个不错的选择!

c++ 用 0x3f3f3f3f 设定最大int值的优点的更多相关文章

  1. Java源码中的发现:快速判断一个int值是几位数

    判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...

  2. C++得到最大的int值

    要得到最大的int值: 1.利用(unsigned int)-1,这样得到的就是unsigned int表示的最大值. 2.int值只是比unsigned int多一位符号位,所以对(unsigned ...

  3. 聊聊java基础,int值强制类型转换成byte

    聊聊java基础,int值强制类型转换成byte 知识点:byte.short.char在表达式中会自动提升为int 之前做一个应用时,打印IP地址,因为是用4个byte存储的,所以打印的时候值范围是 ...

  4. 测试AtomicInteger与普通int值在多线程下的递增操作

    日期: 2014年6月10日 作者: 铁锚 Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,其中一部分如下: java.util.concurrent.atomic.AtomicB ...

  5. 关于mybatis配置文件mapper传int值的问题

    1.首先看mapper代码,这是个更新语句. <set> <if test="sendmode!='' && sendmode!=null"> ...

  6. 阿里巴巴面试之利用两个int值实现读写锁

    首先我们对读写锁做一个概述: 假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁.在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资 ...

  7. 測试AtomicInteger与普通int值在多线程下的递增操作

    日期: 2014年6月10日 作者: 铁锚 Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,当中一部分例如以下: java.util.concurrent.atomic.Atomi ...

  8. [C++]C++得到最大的int值

    要得到最大的int值: 利用(unsigned int)-1,这样得到的就是unsigned int表示的最大值, int值只是比unsigned int多一位符号位,所以对(unsigned int ...

  9. MSIL实用指南-加载int值

    这一篇讲的是怎样加载整数值到运算栈上.这一类的指令都是以Ldc_I4开头. Ldc_I4类OpCodes的Ldc_I4字段的功能是把一个int值压入运算栈上.它的使用方法是ilGenerator.Em ...

随机推荐

  1. spring.net事件的注入

    .c#代码 TestObject source = new TestObject(); TestEventHandler eventListener1 = new TestEventHandler() ...

  2. rocketmq安装部署过程(4.0.0版本)

    准备工作 3个虚拟机节点的构成如下 : 安装步骤 操作过程 1.安装包已经上传至其中1个节点. 2.解压缩安装包 命令:unzip rocketmq-all-4.0.0-incubating-bin- ...

  3. Perl 学习笔记-文件测试

    1.文件测试操作符 针对文件和目录的测试操作符: -r/-w/-x/-o: 文件或目录, 对有效的(负责运行这个程序的)用户或组来说是可读/写/执行/拥有 的; 这些测试位会查看文件的权限位, 以此判 ...

  4. 使用Selenium&PhantomJS的方式爬取代理

    前面已经爬取了代理,今天我们使用Selenium&PhantomJS的方式爬取快代理 :快代理 - 高速http代理ip每天更新. 首先分析一下快代理,如下 使用谷歌浏览器,检查,发现每个代理 ...

  5. 3.3.5 高效读取:不变模式下的CopyOnWriteArrayList

    源码分析:读写(get,add) 一:get 方法 private E get(Object[] a, int index) { return (E) a[index];}可以看到读取数据的时候 没有 ...

  6. UDP问题

    这两天使用C#的UdpClient,本机的服务是采用MFC的socket发的,用C#做客户端,然后客户端启动时,出现该条错误信息 ==通常每个套接字地址(协议/网络地址/端口)只允许使用一次. 笔记的 ...

  7. (3)WePHP控制器与模型

    MVC的先进理念就是程序流程 数据库操作 模板制作三个流程分离 大M函数会把模型引入到当前控制器的方法中,注意这个"excel"对应M文件夹的excel.php 同时也是整个exc ...

  8. 前端实用软件: Markdown工具之---Typora实用技巧(总结)

    Typora是一款超简洁的markdown编辑器,具有如下特点: 完全免费,目前已支持中文 跨平台,支持windows,mac,linux 支持数学公式输入,图片插入 极其简洁,无多余功能 界面所见即 ...

  9. Java文件路径

    几大常用的方法 Class.getResource("")    返回的是当前Class这个类所在包开始的位置 getClassLoader().getResource(" ...

  10. zigzag数组实现

    题目出自面试宝典8.3.2 题目描述: 输入n,求一个n*n的矩阵,规定矩阵沿45度线递增,形成一个zigzag数组(JPEG编码里去像素数据的排列顺序),请问如何用C++实现? 例如: n=2 0 ...