0

64 ビット整数の n 番目のビットを 1 に設定する必要があります。組み込みがあります(ここに文書化されていますhttp://msdn.microsoft.com/en-us/library/z56sc6y4(v=vs.90).aspx):

unsigned char _bittestandset64(
__int64 *a,
__int64 b
);

それが仕事をします。私の質問は、(テストなしで) ビット セットを実行する方法があるかどうか、および目的のために戻り値を無視して bittestandset64 を使用するとパフォーマンスが低下するかどうかです。
GCCで使用するアセンブリでそれを行う方法があるかどうかも興味があります(Intel Core2からi7の場合)。

4

1 に答える 1

2

組み込み関数のポイントは、特定のプロセッサ命令を利用し、コードを最適化するオプションを使用してそれを行うことです。この場合、BTS、ビット テスト、およびセット命令です。「ビットセット」専用の命令はありません。コード ジェネレーターは、結果の値を使用して注意を払います。また、使用しない場合は、キャリー フラグをビット値に変換するコードも生成されません。

したがって、次のような単純なセットです。

 _bittestandset64(&bits, 1);

生成:

 000007F6ED6812CE  bts         qword ptr [rax],1 

次のような結果値を使用している間:

 unsigned char value = _bittestandset64(&bits, 1);

生成:

 000007F7394E14A3  bts         qword ptr [rax],1 
 000007F7394E14A8  setb        al   
 000007F7394E14AB  mov         byte ptr [value],al  

単一の CPU 命令よりも優れた処理を行うことはできません。これはすでに最高の状態です。

于 2013-05-11T14:13:50.743 に答える