这四个函数在 MSVC 中不存在,但可以手动实现。

'__builtin_clz(x)' 函数返回 x 的二进制表示中,从最高位开始连续的 0 的个数,如果 x 为 0,则返回 32(或 64,取决于编译器架构)。

手动实现 '__builtin_clz(x)' 函数:

unsigned int clz(unsigned int x) {
    if (x == 0) return 32;
    unsigned int n = 0;
    if (x <= 0x0000FFFF) { n += 16; x <<= 16; }
    if (x <= 0x00FFFFFF) { n += 8; x <<= 8; }
    if (x <= 0x0FFFFFFF) { n += 4; x <<= 4; }
    if (x <= 0x3FFFFFFF) { n += 2; x <<= 2; }
    if (x <= 0x7FFFFFFF) { n += 1; }
    return n;
}

'__builtin_clzll(x)' 函数与 '__builtin_clz(x)' 函数类似,只不过是用于 64 位整数的。

手动实现 '__builtin_clzll(x)' 函数:

unsigned int clzll(unsigned long long x) {
    if (x == 0) return 64;
    unsigned int n = 0;
    if (x <= 0x00000000FFFFFFFF) { n += 32; x <<= 32; }
    if (x <= 0x0000FFFFFFFFFFFF) { n += 16; x <<= 16; }
    if (x <= 0x00FFFFFFFFFFFFFF) { n += 8; x <<= 8; }
    if (x <= 0x0FFFFFFFFFFFFFFF) { n += 4; x <<= 4; }
    if (x <= 0x3FFFFFFFFFFFFFFF) { n += 2; x <<= 2; }
    if (x <= 0x7FFFFFFFFFFFFFFF) { n += 1; }
    return n;
}

'__builtin_ctz(x)' 函数返回 x 的二进制表示中,从最低位开始连续的 0 的个数,如果 x 为 0,则返回 32(或 64,取决于编译器架构)。

手动实现 '__builtin_ctz(x)' 函数:

unsigned int ctz(unsigned int x) {
    if (x == 0) return 32;
    unsigned int n = 0;
    if ((x & 0x000000FF) == 0) { n += 8; x >>= 8; }
    if ((x & 0x0000000F) == 0) { n += 4; x >>= 4; }
    if ((x & 0x00000003) == 0) { n += 2; x >>= 2; }
    if ((x & 0x00000001) == 0) { n += 1; }
    return n;
}

'__builtin_ctzll(x)' 函数与 '__builtin_ctz(x)' 函数类似,只不过是用于 64 位整数的。

手动实现 '__builtin_ctzll(x)' 函数:

unsigned int ctzll(unsigned long long x) {
    if (x == 0) return 64;
    unsigned int n = 0;
    if ((x & 0x00000000FFFFFFFF) == 0) { n += 32; x >>= 32; }
    if ((x & 0x000000000000FFFF) == 0) { n += 16; x >>= 16; }
    if ((x & 0x00000000000000FF) == 0) { n += 8; x >>= 8; }
    if ((x & 0x000000000000000F) == 0) { n += 4; x >>= 4; }
    if ((x & 0x0000000000000003) == 0) { n += 2; x >>= 2; }
    if ((x & 0x0000000000000001) == 0) { n += 1; }
    return n;
}
GCC 的 __builtin_clz,__builtin_clzll,__builtin_ctz,__builtin_ctzll 函数在 MSVC 中的替代方案

原文地址: https://www.cveoy.top/t/topic/oqLt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录