msc和gcc編譯器的內置函數(Compiler Intrinsics/Built-in Functions)

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/10km/article/details/49122651
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
————————————————
版權聲明:本文爲CSDN博主「10km」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/10km/article/details/49122651

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章