前言
最近在看redis数据结构时,文中提到了全局哈希表,并且在redis Cluster(redis集群)方案中关于如何处理数据切片和实例的对应分布关系的解决方案中给出了取模的实现思路。对于取模、模数的关键词在我们实际开发中可能并不会出现,但是,它确是很多产品架构中在处理一些数据结构或分布式应用中广泛应用到的,此外它也是计算机组成原理中基础支撑,读了很多相关的网上资料,下面整理出来一些便于理解的相关网文,以及自己的一些总结供学习者参考。
一、模的概念
模实际指的就是一个范围,下面摘抄自百度百科的一段话:
“模”是指一个计量系统的计数范围,如过去计量粮食用的斗、时钟等。计算机也可以看成一个计量机器,因为计算机的字长是定长的,即存储和处理的位数是有限的,因此它也有一个计量范围,即都存在一个“模”。如:时钟的计量范围是0~11,模=12。在计算机中表示n位的计算机计量范围是 0~2^n-1,模= 2的n次幂,“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算 。就是取反后加1。
假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12为模的系统里,加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。若用一般公式可表示为:a-b=a-b+mod=a+mod-b。对“模”而言,2和10互为补数。实际上,以12为模的系统中,11和1,8和4,9和3,7和5,6和6都有这个特性,共同的特点是两者相加等于模。对于计算机,其概念和方法完全一样。n位计算机,设n=8,所能表示的最大数是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丢失(相当于丢失一个模)。又回到了 00000000,所以8位二进制系统的模为2^8 。
。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码 。
从上述的解释中可发现一个结论: 在某个数值范围内的加法运算可在MOD值的介入下转换为减法运算,当然也可由减法运算转换为加法运算。这因此也正好引出来计算机的补码。
为了便于理解,下面列举百度知道上的一个问答:
摘自计算机原理中:
问:定点运算中 对整数活小数的补码加减法如
小数:[A]补+[B]补=[A+B]补(mod2) 这个公式该如何理解?
答: 由于定点小数指明了范围是纯小数即(-1~1)的(补码有个-1)。在2个小数做加法时,有可能出现超出1的情况。比如0.5+0.9=1.4。所以就要用MOD2的方法使其还在(纯)小数的范围内。可能会想,那要是不超过范围呢?很简单不超过范围的时候MOD2以后还是原数。为了确保其范围还是小数范围内,同时也为了操作的统一性,所以有MOD2操作。
至于MOD2是什么意思,就是对2取模,通俗的说,如果x>2.,反复操作x-2,直到在某一步x-2操作后,其值落在了(-1~1)范围内.比如,3MOD2的结果就是1。对于负数,就是反复x+2。比如-6MOD2结果是-6+2=-4,-4+2=-2,2-+2=0 就是说结果是0。
总结: 这里在计算 -6 MOD 2 时,加了3次2 才将值落到 (-1,1)范围内。即 -6/2 = -3 余 0 ,即最终的值为取模之后的值,2 为模。下面来说明10进制的模运算。
二、10进制取模运算
1.解释
取模运算(mod)和取余运算(rem)两个概念有重叠的部分,但又不完全一致;主要区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中;取余则更多是数学概念。
2.运算
对于整型数a,b来说,取模运算或者求余运算的方法都是:
1.求整数商: c = [a/b];
2.计算模或者余数: r = a - c*b.
当a和b正负号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。当正负号不一致时,结果不一样。
运算规则:求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。

最低0.47元/天 解锁文章
3869

被折叠的 条评论
为什么被折叠?



