本文主要是介绍gcc __builtin_xxx __attribute__((xxx)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
__builtin_clz
是 GCC 和 Clang 编译器提供的一个内置函数,用于计算一个整数的二进制表示中,从最高位开始连续的 0 的个数。
__builtin_ctz
,返回从最低位开始的连续的 0 的个数;如果传入 0 则行为未定义。
_BitScanForward
,Visual Studio 中的内建函数,等价于 GCC 的 __builtin_ctz
。
__builtin_clz 的内部原理是使用CPU的指令集来实现计算。具体来说,当 CPU 支持 CLZ 指令时,__builtin_clz 会使用 CLZ 指令来计算从最高位开始连续的 0 的个数;否则,__builtin_clz 会使用一些位运算技巧来实现计算。在实现中,__builtin_clz 会根据不同的CPU架构和编译器选项来选择最优的实现方式,从而提高计算效率。__builtin_ctz
的内部原理是使用 CPU 的指令集来实现计算。具体来说,当 CPU支 持 CTZ 指令时,__builtin_ctz
会使用 CTZ 指令来计算从最低位开始连续的0的个数;否则,__builtin_ctz
会使用一些位运算技巧来实现计算。
__builtin_clzll
与 __builtin_ctzll
则是 64 位对应的实现版本。
综上所述: 32位机器和64位机器比较,对于long和unsigned long类型,所占用的空间是不一样的,从代码可移植性考虑,定义变量最好明确所需长度,选用合适的变量类型。
GCC 部分内建位运算函数轮子 - 克莉丝随笔 (xr1s.me)
造个轮子:
/* 优化分支代码编译 */
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)#ifndef ctz
/* 最低为 0 的个数,如果传入 0,结果未知。 */
#define ctz(v) __builtin_ctz(v)
#endifstatic inline u32 ctz64(u64 v)
{u32 *_v = (u32 *)&v;if (_v[0])return ctz(_v[0]);elsereturn ctz(_v[1]) + 32;
}/*! @brief take ceilling of x divided by r */
#define occupied_by(x, r) (((x) + (r) - 1) / (r))
/*! @brief round up x by 2 to the power of r */
#define round_up_by_2_power(x, r) (((x) + (r) - 1) & (~((r) - 1)))
__bulitin_popcount 一共有三个函数,分别适用于不同的输入类型。
int __builtin_popcount (unsigned int x)Returns the number of 1-bits in x.int __builtin_popcountl (unsigned long)Similar to __builtin_popcount, except the argument type is unsigned long.int __builtin_popcountll (unsigned long long)Similar to __builtin_popcount, except the argument type is unsigned long long.
返回输入的二进制表示中1的个数;如果传入0则返回 0 。三个不同的函数分别用于unsigned int,unsigned long以及unsigned long long。
__bulitin_parity 一共有三个函数,分别适用于不同的输入类型。
int __builtin_parity (unsigned int x)Returns the parity of x, i.e. the number of 1-bits in x modulo 2.int __builtin_parityl (unsigned long)Similar to __builtin_parity, except the argument type is unsigned long.int __builtin_parityll (unsigned long long)
返回输入的二进制表示中 1 的个数的奇偶,也就是输入的二进制中1的个数对2取模的结果。三个不同的函数分别用于unsigned int,unsigned long 以及 unsigned long long。
这篇关于gcc __builtin_xxx __attribute__((xxx))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!