7

(任意の) 方程式をビット シフト演算に変換する標準的な方法はありますか?

これは、+ または - ではないものをビット シフトに変換することを意味するため、最後の式にはオペランド<<、>>、+、および -のみが含まれます。これは、フォーミュラのプロセッサへの負担を軽減するためです。

明らかに、これらの結果の方程式は近似値にすぎず、より多くの次数 (1 次、2 次など) を考慮すると精度が向上します。

これに関する情報をウェブで探しましたが、特定の式 (sin、cos、inv など) に関するものを除いて、何も見つかりませんでした。

多項式やテイラー展開のようなものを想定して、それをビットシフト演算に変換していました。

4

3 に答える 3

3

何かをより単純な命令に減らしているからといって、何らかの方法で実行が高速になったり、集中力が低下したりするわけではありません。多くのことを操作のサブセットに減らすことができるかもしれませんが、同じタスクを達成するには、おそらくさらに多くの操作が必要になるでしょう。プロセッサは 1 秒間に非常に多くの操作しか実行できず、最初にそれに遭遇することになります。

一般に、何かを低レベルで最適化しようとするときは、はるかに複雑なオペコードを利用して、必要なオペコードを少なくしようとします。例として、多数の ADD 命令を実行して乗算を実行できます。しかし、最も些細な例以外の場合は、単一の MUL オペコードよりも大幅に多くの ADD が必要になり、実行にはるかに時間がかかります。

ただし、実際の質問に戻ります...効率を完全に無視して、持っている命令セットがTuring Completeである限り、何でも計算できます。その命令をどのように選択するかに注意すれば、実際には単一の命令を使用して何でも計算できます。「任意のアルゴリズムをこれらの命令のみを使用するように変換する」という一般的な目的の方法はないと思います。これは通常、コンパイラ作成者の仕事です。

于 2012-11-20T04:43:20.113 に答える
2

一般的ではありません。

ほとんどの CPU では、乗算は他の算術演算よりも大幅に遅くなることはありません。そのため、定数 2 の累乗による乗算以外に、乗算をビット シフト演算に変換しようとする目的はほとんどありません。

除算に関する限り、定数による除算を逆数による乗算に変換するためのよく知られた方法がいくつかあり、これらの方法は非常に生産的です。方法の説明については、http://www.flounder.com/multiplicative_inverse.htmを参照してください。ただし、非定数値による除算は実際には最適化できません。

もちろん、2 の累乗 (または数値を 2 の累乗で割ること) は、ビット シフトに簡単に変換できます。ただし、他の累乗は簡単には変換できません。

ほとんどの超越関数は、ビットごとのレベルでは適切に表現できません。とにかく、ほとんどが整数で定義されていないことは役に立ちません。

于 2012-11-20T04:44:44.133 に答える
1

ビット演算によるソフトウェア乗算は、最新の CPU でのハードウェア乗算に勝るものはありません。

通常、ビット単位の操作に移行すると、1) ループを回避できる場合、パフォーマンスが向上します。2) 分岐。

ビット ハッキングのための優れたオンライン クックブック。そうでなければ、ハッカーの喜びがあります。

于 2012-11-20T04:59:07.080 に答える