这四个函数在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/fQPb 著作权归作者所有。请勿转载和采集!

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