如何用C编写sql 除法函数和求模函数

C语言(6)
& & & 一直以来都不明白,如果单片机没有计算模块如何进行求模和除法运算的。于是偶然在调试PIC16F887时发现了以下的2个算法:
&span style=&font-size:14&&//==
=====================================;
unsigned char
__lbmod(unsigned char dividend, unsigned char divisor)
unsigned char
unsigned char
counter = 8;
rem = (rem && 1) | (dividend && 7);
dividend &&= 1;
if(divisor &= rem)
} while(--counter != 0);
=====================================;
unsigned char
__lbdiv(unsigned char dividend, unsigned char divisor)
unsigned char
unsigned char
quotient = 0;
if(divisor != 0) {
counter = 1;
while((divisor & 0x80) == 0) {
divisor &&= 1;
counter++;
quotient &&= 1;
if(divisor &= dividend) {
dividend -=
quotient |= 1;
divisor &&= 1;
} while(--counter != 0);
&/span&& &&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9764次
排名:千里之外
转载:10篇
(1)(2)(1)(2)(7)(2)(1)(2)《笔算除法C》教学设计_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
<span class="g-ico g-ico-star g-ico-star-on" style="width:%">
<span class="g-ico g-ico-star g-ico-star-on" style="width:%">
<span class="g-ico g-ico-star g-ico-star-on" style="width:%">
《笔算除法C》教学设计
||暂无简介
总评分4.0|
浏览量24289
阅读已结束,如果下载本文需要使用5下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢C/C++除法实现方式及负数取模详解
一、下面的题目你能全做对吗?
2.7/(-4)=?
4.7%(-4)=?
5.(-7)/4=?
6.(-7)%4=?
7.(-7)/(unsigned)4=?
如过你全部答对,你可以无视后面的内容……
二、除法的取整分类除法的取整分为三类:向上取整、向下取整、向零取整。
1.向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2
2.向下取整:向-∞方向取最接近精确值的整数。在这种取整方式下,7/4=1,7/(-4)=-2,6/3=2,6/(-3)=-2
3.向零取整:向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整。在这种取整方式下,7/4=1,7/(-4)=-1,6/3=2,6/(-3)=-2
通过观察可以发现,无论是向上取整还是向下取整,(-a)/b==-(a/b)都不一定成立。这给程序设计者带来了极大的麻烦。而对于向零取整,(-a)/b==-(a/b)是成立的,以此,C/C++采用这种取整方式。
三、负数取模回想小学的公式:
被除数&除数=商……余数。
由此可知,余数=被除数-商&除数 (*)
对C/C++而言,(*)式依然成立。
并且,该式是解决负数取模问题的关键。
例一:7%(-4)=?
解:由C/C++向零取整的整除方式可知,7/(-4)=-1;由(*)式知,余数=7-(-4)*(-1)=3.所以,7%(-4)=3
例二:(-7)%4=?
解:由C/C++向零取整的整除方式可知,(-7)/4=-1;由(*)式知,余数=(-7)-4*(-1)=-3.所以,(-7)%4=-3
例三:(-7)%(-4)=?
解:由C/C++向零取整的整除方式可知,(-7)/(-4)=1;由(*)式知,余数=(-7)-(-4)*1=-3.所以,(-7)%(-4)=-3
四、相关知识的拓展
1.对于有符号整数与无符号整数间的除法,C/C++会将有符号整数转换为无符号整数,需要特别注意的是,符号位并没有丢失,而是变成了数据位参与运算。这就是(-7)/(unsigned)4不等于-1,而等于的原因。
2.编译器对除法的优化
&#9312;在“无优化”条件下,编译器会在不影响正常调试的前提下,对除法进行简单的优化。
A.“常量/常量”型除法:编译器会直接计算出结果。
B.“变量/变量”型除法:无优化。
C.“变量/常量”型除法:若常量≠2^n,无优化;
否则,除法将被转换为右移运算。由于由右移运算实现的整除实质上是向下取整,所以编译器会通过一些附加的指令在不产生分支结构的情况下将向下取整转换为向零取整。
以【变量/2^3】为例,反汇编代码如下:
mov eax,被除数
若eax&0,则edx=0xFFFFFFFF;
and edx,7 ;若eax&0,则edx=7;否则edx=0
add eax,若eax&0,【(eax+7)/(2^3)】向下取整的值 与
【eax/(2^3)】向零取整的值相等,从而实现向零取整
sar eax,3 ;右移,完成除法
&#9313;在“O2优化”条件下,“常量/变量”型除法中,常量若≠2^n,也可以优化。此时,除法将被转换为乘法与右移的结合形式。例如,a/b=a*(1/b)=a*((2^n)/b)*(1/(2^n)),其中,((2^n)/b为MagicNumber,由编译器在编译过程中算出。这样a/b就变成了(a*MagicNumber)&&n,n的值由编译器选取。需要注意的是,本公式只是除法优化中的一个典型代表,编译器会根据除数对公式进行调整,但基本形式与原理是类似的。
==========================================================================================================================================
在不同的语言中,对负数执行取模运算,结果有可能会是不同的。例如,(-11)%5在python中计算的结果是4,而在C(C99)中计算的结果则是-1。
  truncate除法&&&&floor除法
  在大多数编程语言中,如果整数a不是整数b的整数倍数的话,那么a、b做除法产生的实际结果的小数部分将会被截除,这个过程称为截尾(truncation)。如果除法的结果是正数的话,那么一般的编程语言都会把结果趋零截尾,也就是说,直接把商的小数部分去除。但是如果除法的结果是负数的话,不同的语言通常采用了两种不同的截尾方法:一种是趋零截尾(truncate&toward&zero),另一种是趋负无穷截尾(truncate&toward&negative&infinity);相应的,两种除法分别被称为truncate除法和floor除法。
  事实上,可以认为不管除法的结果是正是负,truncate除法都是趋零结尾;而floor除法都是趋负无穷结尾。
 取模运算
  取模运算实际上是计算两数相除以后的余数。假设q是a、b相除产生的商(quotient),r是相应的余数(remainder),那么在几乎所有的计算系统中,都满足a=b*q+r,其中|r|&|a|。因此r有两个选择,一个为正,一个为负;相应的,q也有两个选择。如果a、b都是正数的话,那么一般的编程语言中,r为正数;或者如果a、b都是负数的话,一般r为负数。但是如果a、b一正一负的话,不同的语言则会根据除法的不同结果而使得r的结果也不同,并且一般r的计算方法都会满足r=a-(a/b)*b。
 常见语言
  (1)C/Java语言
  C/Java语言除法采用的是趋零截尾(事实上,C89对于除数或被除数之一为负数情况的结果是未定义的;C99才正式确定了趋零截尾),即truncate除法。它们的取模运算符是%,并且此运算符只接受整型操作数。一个规律是,取模运算的结果的符号与第一个操作数的符号相同(或为0)。因此(-11)%5=-11-[(-11)/5]*5=-11-(-2)*5=-1。注意因为有复数所以,防止发生出现负数的结果,以(a&%&max&+max)%max的形式输出保证为正!
  (2)C++语言
  C++语言的截尾方式取决于特定的机器。如果两个操作数均为正,那么取模运算的结果也为正数(或为0);如果两个操作数均为负数,那么取模运算的结果为负数(或为0);如果只有一个操作数为负数,那么取模运算的结果是取决于特定实现的。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。c例3除法的简便运算教学设计_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c例3除法的简便运算教学设计
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢模2除法运算-学网-提供健康,养生,留学,移民,创业,汽车等信息
模2除法运算
上上学期学的,我们是这样算的:信息位:AAAAAAAA生成多项式:BBBB(r位)先在信息位后加r-1个0,这里变成AAAAAAAA000然后再用AAAAAAAA000除以BBBB余数就是CRC...除法. ①加法:从低位到高位依次运算,"满二进一",同一数位上只有四种情况: 0+0=0,0+1=1,1+0=1,1+1=10 ②减法:先把数位对齐,同一数位不够减时,从高一位借位,"借一当二"... 用电脑上的计算器算啊[q,r]=deconv([1 8 0 0 -10],[2 -1 3])%q是商,r是余数。数组从后到前表示从次项到各高次项的系数模2除法就是二进制除法. ①加法:从低位到高位依次运算,"满二进一",同一数位上只有四种情况:0+0=0,0+1=1,1+0=1,1+1=10 ②减法:先把数位对齐,同一数位不够减时,从高一位借...源数据是0000还是不包括后面的5个0? 猜你的源数据是。 做CRC-4运算,应该补4个0在源数据后,根据生成多项式计算得到的CRC码就是0101。...main { cin&&n; cout&&n/2;} 用的是++的I/O,C里面没有mod,改用&/&你是转换成二进制除的,还是用十进制除的啊?CRC里的除法不是简单的二进制除法,不信用附件里的计算器算出的结果与它的结果不一样。 CRC的二进制除法是这样的: 1111000 被除数 1101 除数 ---- 够除数的位数... 这个我也有
您可能还关注:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
大类导航: |

我要回帖

更多关于 编写4位除法电路程序 的文章

 

随机推荐