关于移位操作代替乘除运算

liujycquc 2006-08-29 12:00:16
x/2 = x>>1, x/4 = x>>2
那么有没有办法可以用移位操作来实现x/10和x/9(可以结合加减操作)
...全文
856 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mathe 2006-09-01
  • 打赏
  • 举报
回复
今天有点时间,写了个关于上面转化过程的原理,放在:
http://blog.csdn.net/mathe/archive/2006/09/01/1153575.aspx
liujycquc 2006-09-01
  • 打赏
  • 举报
回复
呵呵 不错 不错 虽然和偶想象的有些差距 不过也大开眼界了
mathe 2006-08-31
  • 打赏
  • 举报
回复
除以常数是可以用以为运算代替的,方法就是先将除以常数转化为乘上常数。这种方法是可以精确的而不是近似的。
对于具体问题,很简单,看看编译器怎么做就可以了
比如对于程序
int f(int x){
return x/10;
}
通过gcc -O3 编译出来的代码是
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%ecx
movl $1717986919,%edx
movl %ecx,%eax
imull %edx
sarl $2,%edx
movl %ecx,%eax
sarl $31,%eax
subl %eax,%edx
movl %edx,%eax
movl %ebp,%esp
popl %ebp
ret
也就是:
edx=1717986919;
long long v=(long long)x*edx;
w=(v>>34)-(x>>31);
return w;
然后,我们可以进一步将*1717986919转化为移位运算就可以了
gernal_dn 2006-08-30
  • 打赏
  • 举报
回复
将2进制切换为10进制、9进制,然后移位,再换回来。
ckp 2006-08-30
  • 打赏
  • 举报
回复
好像暂时还没想到好办法,呵呵。
liujycquc 2006-08-29
  • 打赏
  • 举报
回复
to: ckp
x/10是否有办法呢?
ckp 2006-08-29
  • 打赏
  • 举报
回复
1、x*2;
int x;
x<<1;

2、x*10:
int x,y;
y = x;
x = x<<1+y<<3;
liujycquc 2006-08-29
  • 打赏
  • 举报
回复
to:jixingzhong
由乘法递推到除法似乎有点困难,能否再说的详细些
jixingzhong 2006-08-29
  • 打赏
  • 举报
回复
除法类推 ...
jixingzhong 2006-08-29
  • 打赏
  • 举报
回复
利用加减法及移位指令做乘法:

1)左移指令可将操作数乘 2 的整数次方(2、4、8、16);右移指令可将操作数除以 2 的整数次方。

若操作数是无符号数,用逻辑移位指令;若操作数是有符号数,用算术移位指令。

【例1】将 GR0 中的二进制数乘以 8。

  SLL GR0,3

【例2】将 GR0 中的带符号二进制数除以 4。

  SRA GR0,2

2)将移位指令和加减法结合起来可完成乘数不是 2 的整数次方的乘法运算。

【例1】将 GR0 中的二进制数乘以 10。

  START  
  SLL GR0,1
  ST GR0,REG
  SLL GR0,2
  ADD GR0,REG
  RET  
REG DS 1
  END  

【例2】将 GR0 中的二进制数乘以 7。

  START  
  ST GR0,REG
  SLL GR0,3
  SUB GR0,REG
  RET  
REG DS 1
  END
chenhu_doc 2006-08-29
  • 打赏
  • 举报
回复
对2的整数n次幂才有直接的效果。
chenhu_doc 2006-08-29
  • 打赏
  • 举报
回复
x/10和x/9

这样就不是 >> 和<< 所跟转换的了!
superarhow 2006-08-29
  • 打赏
  • 举报
回复
整数的话可以近似来做。例如:x / 5 约等于 x * 205 / 1024。x * 205 = x * 5 * 41
x * 5的算法可以使用LEA EAX, [EAX + EAX * 4]来做,x * 41 = x * (32 + 8 + 1)。
/ 1024就简单了。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧