• c++ 用 0x3f3f3f3f 设定最大int值的优点


    在许多算法中都要用到一个常量来表示最大值,例如:寻找一个最小数,就要先设定一个值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是一个不错的选择!

  • 相关阅读:
    Laravel8 + yansongda/laravelpay 3.1 遇到的问题
    Linux线程02
    Linux线程03
    链表
    02范围for语句,new内存分配,nullptr
    Linux线程01
    01auto关键字,头文件防卫,引用,常量
    (2020行人再识别综述)Person ReIdentification using Deep Learning Networks: A Systematic Review
    (2022 IVC 行人再识别综述)Deep learningbased person reidentification methods: A survey and outlook of recent works
    <a>标签的href传参带中文
  • 原文地址:https://www.cnblogs.com/gongyanyu/p/10477960.html
Copyright © 2020-2023  润新知