C++のプログラムでパリティを計算する関数を高速化しようとして、for文でビット数数えるとかパリティビット生成回路がXORなのを元にシフトとXORで計算するとかいう方法が普通のようで、AIに「C++にてパリティチェックを行う最速の関数を教えてください」と聞いてもこのサイトを参考にするのか全く一緒の回答が返ってくるのだが、もうちょっとだけでも最適化できないものかと思って考えてみた。
単純に元の値を2進数にして立っているビット数の合計が奇数・偶数かでパリティが求められるなら、値のビット数を数える標準ライブラリがあればそれを使った方が最速(コンパイラが勝手に最適化してくれる)んじゃないのか、ってことで、該当のstd:bitset.count()を使った関数だとこうなるはず。
int parity(uint32_t val) {
return std::bitset<32>(val).count() & 1;
}
上記サイトのXOR法だとシフト・XORがそれぞれ5回で合計10命令発生することになるが、このstd:bitset.count()を使うとx64 CPU環境でSSE4.2命令以降を有効にしてコンパイルするとpopcnt命令というレジスタ値のビット数を数える1命令のみ(と奇数・偶数を判定する1のand)だけに最適化がなされたり節約できたりする。
ってAIに「C++にてstd::bitsetを使ってパリティチェックを行う最速の関数を教えてください」とやり方指示したら今度はこれと同じような答えが返ってきた。最初から教えてくれよ。