`
aigo
  • 浏览: 2539274 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

移位实现的乘除法

 
阅读更多

 

移位实现的乘除法比直接乘除的效率高很多。

用移位实现乘除法运算 

  a=a*4; 

  b=b/4; 

  可以改为: 

  a=a<<2; 

  b=b>>2; 

  说明: 

  除2 = 右移1位 乘2 = 左移1位 

  除4 = 右移2位 乘4 = 左移2位 

  除8 = 右移3位 乘8 = 左移3位 

  ... ... 

  通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。 

  大部分的C编译器,用移位的方法得到代码比调用乘除法子程序生成的代码效率高。 

  实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如: 

  a=a*9 

  分析a*9可以拆分成a*(8+1)即a*8+a*1, 因此可以改为: a=(a<<3)+a 

  a=a*7 

  分析a*7可以拆分成a*(8-1)即a*8-a*1, 因此可以改为: a=(a<<3)-a 

  关于除法读者可以类推, 此略.

一个自己曾经忽视的东西,那就是C/C++中的移位操作容易出错的情况。

1、什么样的数据类型可以直接移位

char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以进行移位操作,而double、float、bool、long double则不可以进行移位操作。

 

2、有符号数据类型的移位操作

对于char、short、int、long这些有符号的数据类型:

 

对负数进行左移:符号位始终为1,其他位左移

对正数进行左移:所有位左移,即 <<,可能会变成负数

对负数进行右移:取绝对值,然后右移,再取相反数

对正数进行右移:所有位右移,即 >>

3、无符号数据类型的移位操作

对于unsigned char、unsigned short、unsigned int、unsigned long这些无符号数据类型:

 

没有特殊要说明的,使用<< 和 >> 操作符就OK了

 

结束语

 

8086 中存在逻辑移位、算术移位,而C/C++中的移位似乎既不是逻辑移位,也不是算术移位。

 

比如-1,我们若对它右移1位,C的结果仍旧是-1,事实上无论右移多少位始终是-1,逻辑移位得到的结果(8位表示)应该是-128,所以这点要注意

分享到:
评论

相关推荐

    移位实现乘除法运算

    移位实现乘除法运算移位实现乘除法运算移位实现乘除法运算

    DSP的代码优化求余运算,用移位实现乘除法运算,延时函数

    位操作只需一个指令周期即可完成,而大部分的 C 编译器的“ % ”运算均是调用子程序来完成,代码长、执行速度慢。

    移位除法的实现与原理.pdf

    这个文档有助于学习设计带clk的乘除法。

    C语言代码优化 方案

    (4)用移位实现乘除法运算 (5)避免不必要的整数除法 (6)使用增量和减量操作符 (7)使用复合赋值表达式 (8)提取公共的子表达式 4、结构体成员的布局 (1)按数据类型的长度排序 (2)把结构体填充成最长类型...

    C代码优化方案1、选择合适的算法和数据结构__ 4 2、使用尽量小的数据类型__ 5

    (4)、用移位实现乘除法运算__ 6 (5)、避免不必要的整数除法__ 8 (6)、使用增量和减量操作符__ 8 (7)、使用复合赋值表达式__ 8 (8)、提取公共的子表达式__ 9 4、结构体成员的布局__ 9 (1)按...

    Vivado下无符号及有符号 16_32bit 整数 乘法 除法 加法 减法 及开方的IP实现及仿真验证

    基于Vivado 2020.2下 16bit 32bit 无符号及有符号整数 乘法 除法 加法 减法 及开方的 IP核实现与仿真验证

    基于CORDIC算法的复数除法器FPGA实现

    引入CORDIC 算法到复数的除法运算中, 利用CORDIC 旋转操作来代替乘、加法操作, 然后采用双比特移位操作得到最终运 算结果。经CORDIC 旋转后数据最多只放大2 位位宽, 因此可以减少硬件实现中的器件迭代次数。经过FPGA...

    C代码优化方案

    _2C代码优化方案__41、选择合适的算法和数据结构__42、使用尽量小的数据类型__53、减少运算的强度__5(1)、查表(游戏程序员必修课)_5(2)、求余运算__6(3)、平方运算__6(4)、用移位实现乘除法运算__6(5)、...

    计算机组成原理课程设计乘除法运算.docx

    二、课程设计的任务 针对COP2000实验仪,从详细了解该模型机的指令/微指令系统入手,以实现乘法和除法运算功能为应用目标,在COP2000的集成开发环境下,设计全新的指令系统并编写对应的微程序;之后编写实现乘法和...

    单片机浮点数的实用快速除法

    在较为复杂的单片机系统中! 为扩大取值范围! 实现复杂的计算和控制! 一般都要涉及浮点数的运 算" 而一般单片机是没有浮点数运算指令的! 必须自 行编制相应软件" 在进行除...的乘除法功能! 很轻易地实现了浮点数的除法

    DSP中的单片机浮点数的实用快速除法介绍

    该方法以数值计算中的预估-修正方法为指导,充分利用了16位单片机的乘除法功能,很轻易地实现了浮点数的除法。  1 浮点数格式  IEEE的浮点数标准规定了单精度(4字节)、双精度(8字节)和扩展精度(10字节)三种...

    大整数乘法的实现与分析

    1 绪论 1 ...6大整数除法实现 37 6.1使用减法替换除法运算 37 6.2模拟笔算除法 38 7大整数幂运算实现 43 7.1单数位幂乘 43 7.2 K—RAY幂乘 45 7.3滑动窗口幂乘 45 结论 47 参考文献 48 致谢 49 附录 A 50

    组成原理 课程设计 (软件仿真 VHDL 语言) 源码+报告

    2.原码一位乘实现设计 4 4.累加操作实现 5 三.除法模块详细设计 6 1.实现流程图 6 2.原码加减交替法实现过程 7 3.移位操作与累加操作 7 4.求补操作实现 7 四.仿真过程及仿真结果 7 1.乘法仿真截图 7 2.除法仿真...

    数据结构定点数据运算.pdf

    一、移位运算 二、加法与减法运算 三、软件技术的兴起和发展 四、除法运算 第三节 定点数运算 定点数运算包括移位、加、减、乘、除几种。 一、移位运算 1.移位的意义 移位运算在日常生活中常见。例如 15 米可写作 ...

    计算机组成原理之运算器模拟(C/C++实现)

    用C/C++语言实现计算机内部,运算器基本算术运算和逻辑运算,包括:原码一位乘法、补码一位乘法(Booth)、原码加减交替除法、补码加减交替除法、逻辑左右移位、逻辑与、逻辑或、逻辑非、逻辑异或。由控制器从ins_...

    基于C++实现 RSA 大作业【100012184】

    在本次大作业中,实现了如下基本算法:加、减、乘、除、移位、幂取模的高精度算法,利用快速幂和牛顿迭代法加速取模运算,中国剩余定理,Miller Rabin 检测。

    基于嵌入式机器视觉的信息采集与处理技术研究

    将乘除法换成移位运算、把四字节的数据类型转化为两字节、使用查表算法代替程序中的 乘法运算、编写自己的代码替代开发环境提供的API函数等方式来提高图像处理算法的运 行效率。从图像灰度化的实验结

    基于QT(C++)实现(图形界面)应用密码学大作业【100010263】

    详情介绍:https://www.yuque.com/sxbn/ks/100010263 在本次大作业中,实现了如下基本算法: 加、减、乘、除、移位、幂取模的高精度算法 利用快速幂和牛顿迭代法加速取模运算 中国剩余定理 Miller Rabin检测

    java-algorithms-implementation:用Java实现的算法和数据结构

    Java:算法和数据结构 算法和数据结构是用Java实现... 使用除法和加倍 是2的幂 使用循环 使用递归 使用对数 使用位 译成英文(例如1会返回“ 1”) 到二进制字符串 使用除法和模数 使用右移和模数 使用BigDecimal 加成

Global site tag (gtag.js) - Google Analytics