そのコードは何が起こっているかを示す優れた方法でしたが、私は通常、そのようなコードを使用しません。高速である必要がある場合は、通常、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 なしではそれほど簡単ではありません。彼らが言うように、仕事に適したツールを使用してください。ビットマスが適切なツールである場合もあります。