3
  • ある種の最適化を行うためにビット演算の「ハック」をどのくらいの頻度で使用しますか? 本当にどんな場面で役立つの?

例: if を使用する代わりに:

if (data[c] >= 128) //in a loop
    sum += data[c];

あなたが書く:

int t = (data[c] - 128) >> 31;
sum += ~t & data[c];

もちろん、この特定の状況で同じ意図した結果が得られると仮定します。

  • その価値はありますか?読めない気がします。どのくらいの頻度でこれに遭遇しますか?

注:選択した回答でこのコードを見ました:ソートされた配列の処理がソートされていない配列よりも速いのはなぜですか?

4

3 に答える 3

2

そのコードは何が起こっているかを示す優れた方法でしたが、私は通常、そのようなコードを使用しません。高速である必要がある場合は、通常、x86 で SSE を使用したり、ARM で NEON を使用したりするなど、さらに高速なソリューションがあります。それが利用できない場合は、確かに、それが役に立ち、必要である場合は、それを使用します.

ちなみに、この回答でそれがどのように機能するかを説明します

Skylion のように、私がよく使ってきたことの 1 つは、数値が 2 のべき乗であるかどうかを調べることです。それをどのように行うかについて少し考えてください..次に、これを見てください:(x & (x - 1)) == 0 && x != 0

初めて見たときはトリッキーだと思いますが、慣れると、ビット演算を使用しない他の方法よりもはるかに簡単です。数値から 1 を減算すると、借用が数値の右端から始まり、すべてのゼロを通過し、ゼロに変わる最初の 1 で停止するため、機能します。その数を元の数と AND すると、右端の 1 がゼロになります。2 の累乗には 1 しかなく、1 は消えてゼロになります。他のすべての数値には、特殊なケースであるゼロを除いて、少なくとも 1 つの 1 が残ります。一般的なバリアントはゼロをテストせず、それを 2 の累乗として扱っても問題ないか、ゼロが発生しないことを知っています。

同様に、bitmath で簡単にできることは他にもありますが、bitmath なしではそれほど簡単ではありません。彼らが言うように、仕事に適したツールを使用してください。ビットマスが適切なツールである場合もあります。

于 2013-10-14T08:59:13.587 に答える
1

このようなハックを使用すると役立つ場合がいくつかあります。たとえば、分岐予測子などの一部の Java 仮想マシンの「最適化」を削除できます。いくつかのケースで一度だけ役に立ちました。主なものは-1を掛けることです。大規模な配列全体で何百回も実行している場合は、実際に複数回行うよりも、最初のビットを単純に反転する方が効率的です。私が使用したもう 1 つの例は、数値が 2 のべき乗であるかどうかを知ることです (2 進法では簡単に把握できるためです)。ここに人間の例えがあります。数字のリストがあり、それらが 29 より大きいかどうかを知る必要がある場合、最初の数字が 3 より大きいかどうかを自動的に知ることができ、全体が 30 より大きいか、またはその逆になります。

于 2013-10-14T03:47:01.430 に答える