例如a/10,如何只用位运算就能计算
有这种方法么?
期待中...
在组成原理上看过一个机器上实现除法的算法叫:不恢复余数的二进制除法
寄存器中 乘2为左移,除2为右移。如果除数为2的整数幂则可以通过移位来完成。
这个是常识。对2的非整数幂来说 ,运算器有相应的除法算法。
问搂主,在计算机最底层一切运算不都是位运算吗?
这个不难理解呀,为了便于说明,写一个例子代码:
计算: dx :ax / bx ,且 dx<bx ,计算结果dx:余数,ax 商
mov cx,16 ;结果为16位,循环16次
start:
shl ax,1 ;被除数左移1位
rcl dx,1
cmp dx,bx ;试商
jb next ;当前商为0,不处理
sub dx,bx ;减去阶数
or ax,1
next:
loop start
基本思想: 我们可以回想阶法的手算运程:
1。试商: 将被除数和除数左对齐,看看被除大于等于除数的几倍,得到 当前商,因为是十进制数,故 当前商 为0-9.
2. 将被除数 减去 除数的 当前商 倍.
3. 被除数 左移1位,转第一步,继续试商。
然后 看二进制除法,和十进制除法手算类类似,二进制除法也需3步,不过更加简单。
1. 试商,因为是二进制数,故 当前商 为0-1. 被除数大于除数,当前商 置1,小于除数,当前商 置0
2。被除数 减去 除数的 当前商 倍。当前商为1,被除数减去除数。否则,被除数不变。
3. 被除数 左移1位(二进制的移位),继续 第1步.
通常做法首先将除法转换为乘法:
比如x/10可以转化为:
((x*1717986919)>>34)-(x>>2)
至于要全部转化为位运算,乘法转化为位运算不难
除法的硬件实现就是只用位运算实现的