首先要提一点,在SOC系统中,运算速度一般是移位>乘法>除法。
1.乘法。
最简单的A*B,用C语言for循环
for(int i=0;i 这个是最容易想到的,现在用移位来实现,效率要高一点。
例子1.计算A*17
法1:A=A<<4+A;//移位一次相当于*2
法2:模拟二进制乘法手动运算,适合大整数的乘法。
以前写汇编的时候就写过,利用内存单元(1个byte)来存储乘法的一个位值。
与低位相乘,无非得到原数和0.再做一个大整数的加法,自己判断是否进位了。
大家有兴趣自己实现下。
2.除法
最简单的除法实现A/B,也是用一个for循环
for(int i=0;A>0;A-=B) i++;
移位当然只能实现2的倍数的除法了。
例子2.计算A/8
A>>3
那么计算其它的怎么办呢。本文主要是针对整形除法的,假如做浮点数运算,可以考虑如下,将其分子分母进行一定10的倍数的扩大,结果进行些处理就好了。
写了个简单的代码,模仿手动做除法的过程。
struct NUM
{
int result; //保存商的每一次减法结果
int remainder;//最后的余数
};
struct NUM divde(int div_1,int div_2)
{
//just do int type divide,for float, you can extend the remain value
//default div_2 bigger than div_1
int tmp_1=div_1;//keep the high bit
int count_1=0;
int tmp_2=div_2;
struct NUM num;
num.result=0x00;
while((tmp_1=tmp_1<<1)<=tmp_2)
count_1++;//left aligned
tmp_1=tmp_1>>1;//recovery
// printf("%d %d",tmp_1,count_1);
for(;count_1>=0;count_1--)
{
if(tmp_2>=tmp_1){
tmp_2=tmp_2-tmp_1;
tmp_1=tmp_1>>1;//new round
num.result+=(0x01< }//if
else
{
tmp_1>>1;
continue;
}//else if
}//for
num.remainder=tmp_2;
return num;
}
void main()
{
int div_1=0,div_2=0;
struct NUM num;
printf("please input two number to divede(result no less than 1)\n");
scanf("%d %d",&div_1,&div_2);
if(div_1>div_2)
{
div_1=div_1^div_2;
div_2=div_1^div_2;
div_1=div_1^div_2;
}//simple switch
num=divde(div_1,div_2);
printf("\n%d / %d =%d----%d",div_2,div_1,num.result,num.remainder);
}
代码直接从编辑器拷贝来的,转贴来就这样了,代码思路大概这样:1.小一点的数先移位对齐大一点的数,记下对齐移位的次数,
2.然后被除数减去除数,本次的商被记录为num.result+=(0x01< 并且小数右移一位。
3.余数最后存储在tmp_2做减法的最后结果中。
注:要做大整数除法其实也是类似的思想,只不过操作的基本元素-位换成了内存单元了。
今天要说的基本就是这些了,希望对大家有用。
相关推荐
本文主要讲了移位实现加减乘除,希望对你的虚席有所帮助。
移位实现乘除法运算移位实现乘除法运算移位实现乘除法运算
C语言二进制除法用左右移位来表示.txt
移位相加实现乘法,简单容易懂
线性反馈移位寄存器,介绍了移位寄存器在除法器,编码器,解码器中的使用!
关于C语言位操作,左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。
verilog写的移位除法器,最简单的除法器,没有任何优化
图像的高效编程要点之一_把除法变成乘法和移位
移位相加8位硬件乘法器的 VHDL代码实现
基于Vivado 2020.2下 16bit 32bit 无符号及有符号整数 乘法 除法 加法 减法 及开方的 IP核实现与仿真验证
VHDL除法器设计,配合移位减法方式设计除法器以节省硬件成本
详情请参见:https://handsome-man.blog.csdn.net/article/details/124621467 本篇项目分享一种有趣的LabVIEW编程思维:使用移位寄存器计算平均值。
C语言中的移位操作技巧
单片机汇编利用移位方式实现乘法运算,支持8位和16位。
移位加密的C语言实现,比较完备的,可以参考参考
单片机C语言程序设计 K1-K4 控制LED移位(有源码)单片机C语言程序设计 K1-K4 控制LED移位(有源码)单片机C语言程序设计 K1-K4 控制LED移位(有源码)单片机C语言程序设计 K1-K4 控制LED移位(有源码)单片机C语言程序...
二进制4字节移位除法AVR汇编程序,通用型,
205 字符串字母移位 C语言源代码文件
计算机乘法原理,计算机中的二进制实现乘法就是进行移位指令