为什么INF要设置为0x3f3f3f3f?

解决算法问题时,经常需要赋予变量「无穷大值」INF,而 INF 通常设置为 0x3f3f3f3f

Why 0x3f

0x3f3f3f3f 是16进制表示,转化为10进制为 INF=0B1061109567 ,用科学计数表示法为 1.061×1091.061\times 10^{9}

int型变量的最大值为 2312^{31}-1=2,147,483,6471 = 2,147,483,647,也是 10910^9 数量级

假设所有整数都是int整型,不可溢出

那么使用 0x3f3f3f3f 作为 INF 无穷大的好处如下:

  1. 10910^9 数量级,足够大,符合作为「无穷大」的期望

  2. 加上一个普通的整数(一般不会大于1e9),不会溢出,符合「无穷大加任何数仍然是无穷大」的期望

  3. 0x3f3f3f3f + 0x3f3f3f3f = 0B2122219134 < 2^31-1=0B2147483647

    仍然不会溢出,符合「无穷大加无穷大还是无穷大」的期望

By the way

one can set an array of ints to infinity by doing memset(array, 0x3f, sizeof(array))

对于C++来说,可以使用memset快速重置数组所有元素为无穷大

因为memset是按照字节重置的,而0x3f3f3f3f每8位都是相同的0x3f

好羡慕C++