gcc

阅读: 评论:0

gcc

gcc

__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 部分内建位运算函数轮子 - 克莉丝随笔 ()

造个轮子:

/* 优化分支代码编译 */
#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。

本文发布于:2024-01-29 12:49:25,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170650377015397.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:gcc
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23