x86のビットスキャン命令を探しています
__inline__ size_t bsf(size_t input) {
size_t pos;
__asm__ ("bsf %1, %0" : "=r" (pos) : "rm" (input));
return pos;
}
インラインasmを使用する場合は、pos
とinput
が同じストレージクラス(2、4、または8バイト整数型)であることを確認してください。このインライン関数は問題ありません。
ほとんどのコンパイラには、この命令を使用する組み込み関数がありますが、直接のものを持っているのはMSVCだけです。
最上位ビットセットの場合bsr
は、代わりに同じ構文の命令を使用してください。
注:入力が0(ビットが設定されていない)の場合、結果は未定義です!
pos
入力が0の場合に事前定義された定数を入れるバージョンは次のとおりです。
#define BIT_SCAN_IFZERO 0
__inline__ size_t bsf(size_t input) {
size_t pos, ifzero = BIT_SCAN_IFZERO;
__asm__ ( "bsf %1, %0\n\t"
"cmovz %2, %0"
: "=r" (pos)
: "rm" (input)
, "rm" (ifzero));
return pos;
}
好きなように定義BIT_SCAN_IFZERO
します。そこで負の数が必要な場合は、(符号付きサイズタイプ)に変更size_t
してくださいssize_t