取模运算性质_求余、取模运算在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版权协议,转载请附上原文出处链接及本声明。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
取模运算性质_求余、取模运算在RTOS中计算优先级的理解相关推荐
- 关于取模运算(mod)和求余(rem)运算
通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算.在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的 ...
- php取模,PHP的求余(取模)运算
这篇文章主要介绍了关于PHP的求余(取模)运算 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 先来看下个小案例:$n = 8.45; $result = $n*100; echo g ...
- php 求余 负数,PHP的求余(取模)运算
这篇文章主要介绍了关于PHP的求余(取模)运算 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 先来看下个小案例:$n = 8.45; $result = $n*100; echo g ...
- C++_求2个或3个正整数中的最大数,用带有默认参数的函数实现
C++_求2个或3个正整数中的最大数,用带有默认参数的函数实现 #include<iostream> using namespace std; /*** 求2个或3个正整数中的最大数,用带 ...
- 取模运算性质_数学与编程——求余、取模运算及其性质 | 学步园
一.求余运算(Remainder) http://zh.wikipedia.org/wiki/同余) Euclidean division:Given two integers a and b, wi ...
- 取模运算性质_取模运算的性质
对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 ...
- java 取整符号_浅析java中的取整(/)和求余(%)
1.取整运算符 取整从字面意思理解就是被除数到底包含几个除数,也就是能被整除多少次,那么它有哪些需要注意的地方呢?先看下面的两端代码: int a = 10; int b = 3; double c= ...
- python求余、除法运算、向下圆整、round圆整
>>>1 % 2 1 这是求余运算符. x % y的结果是x除以y的余数. x - ((x // y) * y) 对于整除运算,结果都是向下圆整. >>>1 ...
- c语言用int取整取了小数_[c语言取整算法]C语言中float型数据怎么取整数部分算法或取小数部分...
C语言中float型数据怎么 取整数部分算法 或取小数部分 float福n=12.223; int x=(int)n; float y=n-(float)x; C语言有哪些取整函数? C语言有以下几种 ...
最新文章
- 十五分钟介绍 Redis数据结构
- CSS3控制背景图片大小
- 快读快写:读入输出优化
- 力扣-1337. 矩阵中战斗力最弱的 K 行
- 快速排序C++方法(3种)
- 网站域名安全:泛解析处理及防护
- C#/winform 旅游管理信息系统
- 应用层下的人脸识别(三):人脸比对
- 投入大小的伪原创工具
- 【Codeforces】Chloe and the sequence (递归)
- 程序与进程以及作业之间的区别
- 万恶的prototype
- 达人篇:5)公差的正态分布与CPK与制程能力(重要)
- Typora常用快捷键(详细)
- unity 构建迷宫_教程:使用GameDraw在Unity中构建迷宫游戏关卡
- openstack单节点安装(先电版)
- Yolov3 mAp计算,吐血整理,含Bug处理
- 期货从入门到高深之量化交易1
- Java中内嵌浏览器
- 模拟实现msn登陆过程(MSNP15)