是否有将(任意)方程转换为位移操作的标准方法?
我的意思是将任何不是+或 - 的东西转换成位移,所以结束方程仅包含操作数<<,>>,+和 - 。这样做有利于减少处理器密集度。
显然,这些结果方程式只是近似值,考虑到更多的顺序(一阶,二阶e.t.c),可以提供更高的精度。
我已经在网上搜索了关于此的任何信息,但找不到任何信息,除了特定公式的内容(sin,cos,inv e.t.c)。
我想象的是多项式或泰勒的扩展过程,然后将其转换为位移操作。
答案 0 :(得分:3)
仅仅因为你正在减少对更简单指令的处理,并不意味着它们会以某种方式执行得更快或更少。虽然您可以将许多事情减少到减少的操作子集,但您可能需要更多的操作才能完成相同的任务。处理器每秒只能执行如此多的操作,而您将首先遇到这种操作。
通常,当尝试在较低级别优化某些内容时,您会尝试使用更复杂的操作码,以便您需要更少的操作码。例如,您可以通过执行许多ADD指令来执行乘法运算。但是,对于除了最微不足道的例子之外的任何事情,它将花费比单个MUL操作码更多的ADD,并且执行时间要长得多。
回到你的实际问题但是......完全无视效率,你可以计算任何东西,只要你拥有的指令集图灵完成。如果你小心选择那条指令,你实际上可以用a single instruction计算任何东西。我不相信有任何通用的方式来说“将任意算法转换为只使用这些指令”,这通常是编译器编写者的工作。
答案 1 :(得分:2)
不一般。
在大多数CPU上,乘法并不比其他算术运算慢得多,因此除了乘以2的常数幂之外,尝试将乘法转换为位移操作的目的很小。
就除法而言,有一些众所周知的方法可以将除以常数转换为乘以逆,这些方法非常有效。有关如何解释,请参阅http://www.flounder.com/multiplicative_inverse.htm。但是,非常数值除法不能真正优化。
将2增加到幂(或将数除以2的幂)当然很容易转换为位移。但是,其他取幂也不容易转换。
大多数超越函数不能在按位级别上合理地表示。无论如何,大多数都没有在整数上定义,这没有任何帮助。
答案 2 :(得分:1)
使用逐位运算的软件乘法不太可能超过现代CPU上的硬件乘法。
如果允许避免1)循环,通常逐步进行逐位操作可以产生更好的性能;和2)分支。
A good online cookbook有点黑客攻击。否则有A Hacker's delight。