社区
其它技术问题
帖子详情
关于移位操作代替乘除运算
liujycquc
2006-08-29 12:00:16
x/2 = x>>1, x/4 = x>>2
那么有没有办法可以用移位操作来实现x/10和x/9(可以结合加减操作)
...全文
856
14
打赏
收藏
关于移位操作代替乘除运算
x/2 = x>>1, x/4 = x>>2 那么有没有办法可以用移位操作来实现x/10和x/9(可以结合加减操作)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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就简单了。
计算机组成原理-
移
位运算教学内容.ppt
例如,在处理大量数据时,通过
移
位运算
代替
乘
除运算
可以减少计算次数,从而节省处理时间。 此外,
移
位运算还涉及到
位操作
的硬件实现,这包括了数字电路中的
移
位寄存器和处理器中的指令执行。这部分内容要求学生不仅...
计算机组成原理:3.6 运算器ALU组成与实例.ppt
带多路选择器的运算器可以完成加减乘除四则运算的并行定点运算。带锁存器的运算器来自存储器或外部设备的数据,双操作数指令,暂存第一个操作数,暂存ALU计算出来的结果数据,记录“进位”、“溢出”、“零”和“负...
位运算.pdf 精心收集的资料,重新编辑
首先,位运算是基于二进制位的操作,它直接对数据的二进制表示进行处理。在ACMer(参加ACM/ICPC国际大学生程序设计竞赛的选手)中,熟练掌握位运算能够显著提升程序的运行效率,减少计算量。 1. 位运算的基本应用:...
如何写出好的单片机C语言代码
例如,使用位运算
代替
取余运算(a&7
代替
a%8),使用
移
位运算
代替
乘
除运算
(a
代替
a*4,b>>2
代替
b/4)。这些简化的运算方式不仅减少了计算时间,同时也降低了代码的复杂度。 最后,优化循环结构是单片机编程中提升...
C语言程序运行速度优化方法谈.docx
-
移
位运算
代替
乘除法:当乘除以2的幂次时,使用
移
位操作
可以显著提高效率,如a=a
代替
a=a*4,b=b>>2
代替
b=b/4。 此外,还可以通过其他方式优化运算,例如将多个运算合并为更简洁的表达式,减少运算次数。例如,将x=...
其它技术问题
3,881
社区成员
9,044
社区内容
发帖
与我相关
我的任务
其它技术问题
C/C++ 其它技术问题
复制链接
扫一扫
分享
社区描述
C/C++ 其它技术问题
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章