计算机中如何实现除数是2的幂次的除法【转载自CSDN】
前言:
本来是在看汇编里面的数据条件传送指令,做习题的时候看着这么一道有关于2的幂次方除法的题目。结果傻眼了,又尼玛不会了。。。。。。。。。第二章看的时候就稀里糊涂的,看了几遍也没看太懂,这回又涉及到了 ,发现再回来看还是容易一点。所以写此博文,方便日后复习。
我今天遇到的问题如下:
问题:
除法,在我们平时的算数运算中,结果总是向0的方向舍入的,但是在计算机中,舍入的方式有所不同。在大多数的机器中,除法要比乘法还有加法这些运算都要慢很多倍,计算机中对于2的幂次这种数很是敏感,因为计算机当中用到的指令和进制本来就是二进制的形式,计算机用这种方式运算是最快的。所以,在做除法时如果除数是2的幂次,那么我们就可以进行一些优化,让运算做到更加快速。
解决办法:
因为左移运算相当于是乘以2,右移运算相当于除以2.所以说当我们的除法的除数是2的幂次方的时候,利用单纯的移位运算要比利用普通方法快的多。
对于无符号数来说, 如果除数是2的k次幂,那么我们就会把被除数啊相应的做算数右移操作,右移k位。这样的结果和平时我们做除法的结果是一样的。
对于无符号数来说,假设x是一个有w位的二进制数,x'是从第w位到k位的序列,x''是0-k位的序列。那么x' =floor(x/2^k),这个表达式是可以证明的,过程还是很easy的我就不多说了。
对于一个无符号数还有一个有符号数的非负数来说的话,除以2的k次幂和把被除数右移k位的结果是一样的
但是对于有符号数的负数来说,就会有一些差错。
在 十进制那一栏里面是计算机的计算结果舍入之后的结果,最右边一栏是计算机算的结果,我们可以看出来,在整除也就是不需要舍入的时候,结果和右移k位的操作是一样的,但是如果一旦没有整除需要进行舍入的时候,我们就会发现出了问题了,移位导致它不是向0舍入而是向下舍入,-771.25按理说应该舍入为-771,但是他却舍入到了-772.
在平时进行手算除法的时候,我们的结果统一都是向0舍入的,但是在计算机中确实向下舍入,因为非负数向下舍入就是向0舍入所以不会有影响,但是负数的话就不会了。因为移位之后,负数在左边补充的是最高的符号位,而不是0.负数在做除法的 时候应该是向上舍入才符合手算中向0舍入的规则。
对于负数除法向0舍入的解决办法:
为了保证正确的舍入方式,我们决定利用一个偏置值来解决这个问题。
对于任何整数x和y>0,有ceil(x/y) = floor((x+y-1)/y)
假设x=ky + r (r>=0 && r < y span>
我们就可以清楚(x+y-1)/y = (ky+ r - 1)/y = k + (r + y - 1)/y
如果此时x能整除y,即r = 0,那么ceil(x/y) = floor((x+y-1)/y) = k
否则的话等于k + 1那么也就是说,在计算被除数是负数,除数是2的幂次的除法的时候,可以给x加上除数-1(y-1)这个偏移量,即可保证除法的结果是正确的,因为在除数是2的幂次的时候,才能够用右移操作来进行替代,则当被除数是负数的时候,要给他加上2^k - 1这个偏移量,才能够得到正确的结果。
所以在计算机内如果除数是2的幂次的时候,是会用向下面的这个表达式的形式去计算除法的的
(x < 0 x k -x >> k
计算机中如何实现除数是2的幂次的除法【转载自CSDN】的更多相关文章
- Win10 VC++6 无法启动此程序,因为计算机中丢失mfc42d.dll 需要提升
亲测可用 1.无法启动此程序,因为计算机中丢失mfc42d.dll 我也遇到了这个问题,并且顺利解决了!按一下流程搞定的: “工程-设置-常规-microsoft基础类,(选择使用MFC作为静态链接库 ...
- 计算机中位(bit), 字节(byte), 字(word)的关系
1.位(bit) 来自英文bit,音译为“比特”,表示二进制位.位是计算机内部数据储存的最小单位,11010100是一个8位二进制数.一个二进制位只可以表示0和1两种状态(21):两个二进制位可以表示 ...
- 无法启动此程序,因为计算机中丢失AdbWinApi.dll。尝试重新安装该程序以解决此问题
第一次搭建android开发环境,装完adb以后,打开DOS验证安装是否成功:但输入adb logcat调试时,系统弹出以下异常的对话框: 无法启动此程序,因为计算机中丢失AdbWinApi.dll. ...
- 解决【无法启动此程序,因为计算机中丢失MSVCP71.dll。尝试重新安装该程序以解决此问题】问题
今日电脑偶然出现:[无法启动此程序,因为计算机中丢失MSVCP71.dll.尝试重新安装该程序以解决此问题.]的不断地弹窗报错. 在网上查找了好久,也没有找到解决办法,就在我将要准备重装系统的时候,又 ...
- 计算机中的颜色XIV——快速变换颜色的V分量
基本知识回顾: 计算机中的颜色Color,用RGB模式存储(用R.G.B三个分量表示颜色,每个分量的范围是0—255). 而计算机中的颜色除了用RGB模式表示以外,常见的还有HSV模式(或者是HSB. ...
- 计算机中丢失 msvcr110.dll 怎么办
笔者在一次运行 php.exe 时,运到“无法启动此程序,因为计算机中丢失 MSVCR110.dll.尝试重新安装该程序以解决此问题.”的提示,当时很无语,因为系统是刚刚安装好的,而且是最新版本的. ...
- 强势解决:windows 不能在本地计算机中起动Tomcat参考特定错误代码1
Tomcat添加系统服务:service.bat install 启动本服务的时候却提示“windows 不能在本地计算机中起动 Apache Tomcat参考特定错误代码1,若不是Microsoft ...
- 计算机中的大小端模式及C语言中如何鉴别他们
我的博客:www.while0.com 参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544 写的很详细. 大小端主要是对数字类型来 ...
- 当向计算机中存入一个float类型的数值2.2 后,在从计算机中读出输出,这时2.2 的值已经发生了变化(转)
problom : 'f1' value hava been changed when output. reason : the binary repersentation of 2.2f is : ...
随机推荐
- STL版 括号匹配(感觉不如之前自己用数组模拟的跑的快)
数据结构实验之栈四:括号匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的 ...
- 关于S50卡密钥A和密钥B
关于S50卡密钥A和密钥B 1. Mifare_Std 卡片的密钥属性取决于控制字.控制字的默认值是“FF078069”,此时 A密钥:不可被读出,有全部权限. B密钥:可被读出,没有任何权限. 2. ...
- css元素定位样式
曾经写网页,学css整体上不难,但就是元素定位,始终一知半解,直到今天,本着实践出真知的理念,经过认真测试,总结出了如下结论. css 定位: positionstatic : 默认静止定位,元素在正 ...
- hdu-5761 Rower Bo(数学)
题目链接: Rower Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- (QA-LSTM)自然语言处理:智能问答 IBM 保险QA QA-LSTM 实现笔记.md
train集: 包含若干条与保险相关的问题,每一组问题对为一行,示意如下: 可分为四项,第三项为问题,第四项为答案: 1.build_vocab 统计训练集中出现的词,返回结果如下(一个包含3085个 ...
- BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...
- 表单提交Post方法、Get方法
表单用来接受用户的输入,并将用户的输入以“name=value值对”集合的形式提交到服务器进行处理.那么表单是怎样将数据提交到服务器的?服务器是怎样对表单数据进行处理的?下面我将为大家揭开表单提交背 ...
- live555 基本类之间的关系
live555 中存在这5个最基本的类.每个类中都拥有一个BasicUsageEnvironment. 这是这几个类之间的相互关系. MediaSession可以拥有多个subsession.
- 使用git命令将本地项目上传到GIthub
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点“.”,意为添加文 ...
- Android 电脑投屏工具Vysor Pro介绍
Chrome的插件,直接到chrome的扩展程序里面搜索Vysor,安装即可 如何破解: C:\Users\lanlan.shi\AppData\Local\Google\Chrome\User Da ...