无穷大常量0x7fffffff 0x3fffffff 0x3f3f3f3f

int型变量的取值范围:[-2^31, 2^31 - 1]  ->  [-2147483648, 2147483647]

0x7fffffff = 2147483647
           = (2^31 - 1)
           = (1 << 31) - 1

0x3fffffff = 1073741823
           = (2^30 - 1)
           = (1 << 30) - 1

0x3f3f3f3f = 1061109567

在写算法题目时常常需要用到无穷大,比如在求图的最短路径时,就需要先将源点到各点的最短距离设置为无穷大。

在十进制表示下,0x7fffffff = 2147483647,恰好等于int型变量的上界,所以在一些情况下用0x7fffffff表示无穷大是一个很好的选择。

这些情况包括但不限于数的比较,min(num, 0x7fffffff),一开始设置num是0x7fffffff,用这个式子判断是否num已改变

但是对于很多情况,设置无穷大为0x7fffffff并不能满足我们的需求。因为对于无穷大,加上一个数应该还是无穷大。而在计算机中,0x7fffffff加上一个数后会溢出,不仅不再是无穷大,还可能是负数。

显然需要换个数来表示无穷大,这次我们选择 0x3fffffff,这个数用十进制表示是(1 << 30) - 1。因为一般场合下程序中的数据都是小于1e9的,而0x3fffffff = 1073741823 > 1e9。那么这个数不仅满足了比程序中的任何数都大,而且0x3fffffff + 0x3fffffff = (1 << 31) - 2小于int型的边界(1 << 31) - 1 = 2147483647,所以也满足了无穷大加上一个数还是无穷大。

除了用0x3fffffff表示无穷大之外,我们还经常能看到用 0x3f3f3f3f 表示无穷大。和0x3fffffff一样,一般场合下的数据都是小于1e9的,而0x3f3f3f3f = 1061109567 > 1e9。0x3f3f3f3f + 0x3f3f3f3f = 2122219134 < int型的边界(1 << 31) - 1 = 2147483647,也满足无穷大加上一个无穷大还是无穷大。

不仅如此,如果要对一个数组全部赋值无穷大时,使用循环赋值不如使用memset赋值快。memset是按字节赋值的,它能够对数组清零 memset(arr, 0, sizeof(arr))(因为0的每个字节都是0);或者全部赋值-1 memset(arr, -1, sizeof(arr))(-1在计算机中的表示形式为111 … ,每个字节都是11111111);由于0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部设置为无穷大时,我们只需要 memset(arr, 0x3f, sizeof(arr))

对于上述三种对无穷大的定义,除了第一种需要根据题目要求判断是否需要有无穷大加上一个数的操作来选择之外,选择哪种定义取决于个人喜好。

#define INF1 0x7fffffff
#define INE2 0x3fffffff
#define INF3 0x3f3f3f3f
// 不推荐使用上面的宏定义
// 我们只是设置一个常量而已,使用 const 就好
const int INF4 = 0x7fffffff;
const int INF5 = 0x3fffffff;
const int INF6 = 0x3f3f3f3f;
  • 15
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值