Cのビット演算子、、、&
および|
は~
通常、アセンブリ言語のオペコードでもあるため、ビットマスキングコードは原則として非常に高速である必要があります。
シミュレーションアルゴリズムの内部ループ内にビットマスキングを追加する方法について、いくつかの選択肢があります。基本的には、事前に用意されたマスクの配列を使用するか、左右のシフトを使用してマスクを動的に変更するかの選択に要約されます。
ビットマスキングを不要なオーバーヘッドからできるだけ解放するための特定のトリック/テクニックはありますか?効率の観点から、以下の3つのアプローチのいずれかが特に良い/悪いですか?
オプション1:事前に用意されたマスクの配列をループする、たとえば特定のビットを選択する
unsigned char mask[8]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1}; for(i=0;i<8;i++) { ... (mask[i] & mem_data ) ...
}
オプション2:各ループ反復で複数の場所をダウンシフトする
unsigned char mask=0x80; for(i=0;i<8;i++) { ... mem_data & (mask>>i) ... }
オプション3:各ループ反復で正確に1つの場所をダウンシフトする
unsigned char mask=0x80; while(mask) { ... mem_data & mask mask>>=1; ... }
編集: 質問の邪魔にならないように、例からputchar()を削除しました