2

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()を削除しました

4

1 に答える 1

2

ビットマスクは、埋め込みの世界でよく使用されます。

すべてのプロセッサが可変引数を使用してビット単位のシフトを実行できるわけではありません。たとえば、MSP430プロセッサでは、一度に1ビットしかビットシフトできません。実装は、可変量でシフトするソフトウェアに頼ります。その場合、オプション番号2は避ける必要があります。より一般的には、プログラムのアセンブリ出力を見て、最も効率的なソリューションを比較します。

于 2012-10-15T21:27:22.500 に答える