取模运算性质_求余、取模运算在RTOS中计算优先级的理解

uCOS3中的部分源码:

/* 置位优先级表中相应的位 */

void OS_PrioInsert (OS_PRIO prio)

{

CPU_DATA bit;

CPU_DATA bit_nbr;

OS_PRIO ix;

/* 求模操作,获取优先级表数组的下标索引 */

ix = prio / DEF_INT_CPU_NBR_BITS;//32bits

//由于数据均为无符号数,prio为8位无符号数、 DEF_INT_CPU_NBR_BITS为32位无符号数

ix的值为0 这么做是未来兼容优先级>32个的数量要求(此处8/32得0)

/* 求余操作,将优先级限制在DEF_INT_CPU_NBR_BITS之内 *///CPU_DATA unsigned int

这个没有问题对变量 prio进行求值赋值给

bit_nbr = (CPU_DATA)prio & (DEF_INT_CPU_NBR_BITS - 1u);

这个没有问题,对形参prio进行求值赋值给 bit_nbr

/* 获取优先级在优先级表中对应的位的位置 */

bit = 1u;

bit <<= (DEF_INT_CPU_NBR_BITS - 1u) - bit_nbr;

/* 将优先级在优先级表中对应的位置1 */

OSPrioTbl[ix] |= bit;

}

/* 清除优先级表中相应的位 */

void OS_PrioRemove (OS_PRIO prio)

{

CPU_DATA bit;

CPU_DATA bit_nbr;

OS_PRIO ix;

/* 求模操作,获取优先级表数组的下标索引 */

ix = prio / DEF_INT_CPU_NBR_BITS;

/* 求余操作,将优先级限制在DEF_INT_CPU_NBR_BITS之内 */

bit_nbr = (CPU_DATA)prio & (DEF_INT_CPU_NBR_BITS - 1u);

/* 获取优先级在优先级表中对应的位的位置 */

bit = 1u;

bit <<= (DEF_INT_CPU_NBR_BITS - 1u) - bit_nbr;

/* 将优先级在优先级表中对应的位清0 */

OSPrioTbl[ix] &= ~bit;

}

********************************数据类型的宏定义***************************************

#define DEF_INT_CPU_NBR_BITS (CPU_CFG_DATA_SIZE * DEF_OCTET_NBR_BITS)

#define CPU_CFG_DATA_SIZE CPU_WORD_SIZE_32

#define CPU_WORD_SIZE_32 4u

#define DEF_OCTET_NBR_BITS 8u

******************************************************************************************

typedef CPU_INT08U OS_PRIO;

typedef unsigned char CPU_INT08U;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%以下为网络上的资料:

(参考维基百科:

Euclidean division:Given two integers a and b, with b ≠ 0, there exist unique integers q and r such that a = bq + r and 0 ≤ r < |b|, where |b| denotes the absolute value of b.

(术语: a 被除数 dividend ; b 除数 divisor;q 商 quotient;r 余数 remainder)

按照上面的定义:余数唯一并始终大于或等于0,并可以拓展到两个整数为正数或负数的情况。

但是,程序设计语言求余算法并不是按照上面的定义来执行。

我们引出另一种余数定义:a = bq + r and 0 <= |r| < |b| 。于是,我们可以发现这种情况下余数可能不止一个。

例子:a = 43 b = 5时:

43 = 5 * 8 + 3 : q = 8;r = 3 (r > 0)

43 = 5 * 9 - 2 : q = 9;r = -2 (r < 0)

当a 和 b 含有负数时也存在这两种余数。

例子:a = 43 b = -5时:

43 = -5 * -8 + 3 : q = -8;r = 3 (r > 0)

43 = -5 * -9 - 2 : q = -9;r = -2 (r < 0)

大多数程序设计语言要求余数与被除数的正负号相同(参考自《C陷阱与缺陷》,强调了程序的可移植性问题,即被除数或除数含有负数时要谨慎对待)。这说明不同程序设计语言实现时对上述例子求余时可能是上面不同的解。

二、取模运算 (Modulo)

In computing, the modulo operation finds the remainder after division of one number by another (sometimes called modulus).

上面这句话说明,取模运算和求余运算的目标都是一致的。只是不同程序设计语言时实现的方式可能不同,也就是上面所说的采用另一种余数定义时,含有两种余数结果。一些语言可能会采取第一个结果;另一些语言可能会采取第二个结果;还有些语言可能会把取模和求余分开定义,分别采取两种结果。维基百科里面就列出了一些程序设计语言采取的操作,常见的为以下几种:

1.求余结果或取模结果的正负号与被除数相同;

2.求余结果或取模结果的正负号与除数相同;

3.求余结果或取模结果的总是正数;

4.求余结果或取模结果由实现定义;

5.求余结果或取模结果为最接近0的数;

求余运算和取模运算小结:有人会把取模运算和求余运算分开解释,又采用特定的语言去举例,我认为这两种运算目标都是一致,只是求余运算倾向于数学,而取模运算倾向于计算机科学,之所以不同语言会有不同的结果,本质是因为根据求余运算定义导致余数不唯一时不同程序设计语言采用了不同的结果,但他们都会根据某种依据来给出唯一的结果。这也告诉我们,程序移植时必须当心这种差别,特别是当两个整数含有负数的情况。

三、取模运算性质

术语:

For a positive integer n, two integers a and b are said to be congruent modulo n, and written as

一些有用的性质(可证明):

如果a≡b(mod m),x≡y(mod m),则a+x≡b+y(mod m)。

如果a≡b(mod m),x≡y(mod m),则ax≡by(mod m)。

如果ac≡bc(mod m),且c和m互质,则a≡b(mod m) (就是说同余式两边可以同时除以一个和模数互质的数)。

————————————————

版权声明:本文为CSDN博主「chensilly8888」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值