mscとgccコンパイラの内蔵関数(Compiler Intrinsics/Built-in Functions)


mscとgccコンパイラは豊富な内蔵関数を提供しており、関数名はそれぞれ異なるが、常に共通の内容が多く、プラットフォーム間開発に非常に役立ち、これらの関数を上手に使うことで、プログラムの効率を高めると同時に開発作業量を減らすことができる.mscの内蔵関数はCompiler Intrinsics、関連ドキュメントはここでCompiler Intrinsics(クリックしてリンクを開く)gccの内蔵関数はBuilt-in Functionsと呼ばれ、関連ドキュメントはここでBuilt-in Functions(クリックしてリンクを開く)
次のコードはmscとgccの内蔵関数で32ビットと64ビットの数値を逆ビットスキャンし、最上位1の位置(0-31または0-63)を返し、入力パラメータが0の場合-1を返します.
#ifdef _MSC_VER
#include <intrin.h>// 
//msc  (Compiler Intrinsics)
inline __int8 _bsr_int64_(unsigned __int64 num) {
    unsigned long index;
    return _BitScanReverse64(&index, mask)?index:-1;
}
inline __int8 _bsr_int32_(unsigned __int32 num) {
    unsigned long index;
    return _BitScanReverse32(&index, mask)?index:-1;
}
#elif __GNUC__
//gcc  (Built-in Functions)
inline __int8 _bsr_int64_(unsigned __int64 num) {
    return num==0?-1:(sizeof(num)<<3)-1-__builtin_clzll(num);
    //clzll 64 0 , 1 63( 63 0)
}
inline __int8 _bsr_int32_(unsigned __int32 num) {
    return num==0?-1:(sizeof(num)<<3)-1-__builtin_clz(num);
    //clz 32 0 , 2 30( 30 0)
}
#endif