博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程中常用的几个特殊值
阅读量:5300 次
发布时间:2019-06-14

本文共 1643 字,大约阅读时间需要 5 分钟。

一、INF=0x3f3f3f3f

我们知道计算机都是按照二进制存储的。在日常练习过程中,我们都会遇到INF无穷大量的问题,那么我们该怎么定义这么一个数字,下面便有一些说明:

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

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

0x7fffffff和0x3f3f3f3f区别使用:

二、0x7fffffff

可以算一下 0x7FFFFFFF 是多少

每个十六进制数4bit,因此8位16进制是4个字节,刚好是一个int整型
F的二进制码为 1111
7的二进制码为 0111
这样一来,整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1
就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)

 

用 INT_MAX 常量可以替代这个值。

三、INT_MAX和INT_MIN

C中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中。

1. INT_MAX,INT_MIN数值大小

因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31.C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。

2. 关于INT_MAX INT_MIN的运算

由于二进制编码按原码、补码和反码的规则进行运算,所有程序中对INT_MAX和INT_MIN的运算应当格外注意,在出现溢出的时候,不遵循数学规则。

INT_MAX + 1 = INT_MIN

INT_MIN - 1 = INT_MAX

abs(INT_MIN) = INT_MIN

比较有趣的是,INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0.

四、常用的几个质数

因为要使字符串的哈希值各不相同,所以要取一些奇奇怪怪的质数进行MOD,比如19260817(逃)

常见的质数 1e9+7,1e9+9,233,19260817,196608131e9+7,1e9+9,233,19260817,19660813 等
为了防止相同,经常会使用双膜数,即取两次模,判断是否相等,就能使运算更加精确。

转载于:https://www.cnblogs.com/tflsnoi/p/10356495.html

你可能感兴趣的文章
java线程安全总结 - 2 (转载)
查看>>
配置文件——App.config文件读取和修改
查看>>
为iOS5设计消息通知
查看>>
Android中的5种数据存储方式
查看>>
CSS属性之float学习心得
查看>>
一次下载多个文件
查看>>
dwr的ScriptSession和HttpSession分析
查看>>
杂项-.Net-HQL:HQL
查看>>
java面向对象
查看>>
浅谈const_cast
查看>>
BZOJ 2288: 【POJ Challenge】生日礼物 堆&&链表
查看>>
python入门(六)
查看>>
深入了解java虚拟机(JVM) 第十三章 虚拟机字节码执行引擎
查看>>
VC++ 模块与资源分离
查看>>
CWorkBooks、CWorkBook、CWorkSheets、CWorkSheet、CRange
查看>>
Ocx控件注册不成功?可能是tlb文件导致~
查看>>
进制转换
查看>>
JS鼠标事件大全
查看>>
css的动画和过渡
查看>>
Tomcat最大连接数问题
查看>>