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 位对应的实现版本。

gcc __builtin_xxx __attribute__((xxx))_第1张图片

 综上所述: 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)
#endif

static inline u32 ctz64(u64 v)
{
	u32 *_v = (u32 *)&v;

	if (_v[0])
		return ctz(_v[0]);
	else
		return 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。

你可能感兴趣的:(Development,Tools,设计,c语言)