> 文档中心 > C/C++ 7个 __builtin 函数总结

C/C++ 7个 __builtin 函数总结

众所周知,以 __builtin 开头的函数,是一种相当神奇的位运算函数,下面本人盘点了一下这些以 __builtin 开头的函数,希望可以帮到大家。

注:所有带 ll 的名字,均为 long long 类型下运算,否则将当作 int 来算。

1   __builtin_ctz( )  /  __buitlin_ctzll( )

用法:返回括号内数的二进制表示形式中末尾0的个数。

举个例子

#include using namespace std;int main() {ios::sync_with_stdio(0);cin.tie(0);cout<<__builtin_ctz(64)<<endl;return 0;}

输出:6

64=(1000000)_2,末尾共有6个0。

2 __buitlin_clz( )  /  __buitlin_clzll( )

用法:返回括号内数的二进制表示形式中前导0的个数。

举个例子:

#include using namespace std;int main() {ios::sync_with_stdio(0);cin.tie(0);cout<<__builtin_clz(63)<<endl;return 0;}

输出:26

63=(0000~0000~0000~0000~0000~0000~0011~1111)_2(加空格是为了方便大家看的清楚)开头共有26个0。

让我们把 int 换成 long long 试试:

#include using namespace std;int main() {ios::sync_with_stdio(0);cin.tie(0);cout<<__builtin_clzll(63)<<endl;return 0;}

输出:58   开头共有58个0 (long long是64位!) 。

3 __builtin_popcount( )

用法:返回括号内数的二进制表示形式中1的个数。

举个例子:

#include using namespace std;int main() {ios::sync_with_stdio(0);cin.tie(0);cout<<__builtin_popcount(4095)<<endl;return 0;}

输出:12

4095=(1111~1111~1111)_2,共有12个1。

4 __builtin_parity( )

用法:返回括号内数的二进制表示形式中1的个数的奇偶性(偶:0,奇:1)。

举个例子:

#include using namespace std;int main() {ios::sync_with_stdio(0);cin.tie(0);cout<<__builtin_parity(1)<<endl;return 0;}

输出:1

1里面有1个1,所以当然输出1咯。

5 __builtin_ffs( )

用法:返回括号内数的二进制表示形式中最后一个1在第几位(从后往前)。

举个例子:

#include using namespace std;int main() {ios::sync_with_stdio(0);cin.tie(0);cout<<__builtin_ffs(84)<<endl;return 0;}

输出:3

84=(101100)_2,所以是3。

6 __builtin_sqrt( )

用法:快速开平方。

7 __builtin_sqrtf( )

用法:快速开平方。

那么他们跟 sqrt() 有什么区别呢?

做个简单测试:1到10^8,看看耗时:

sqrt:  约 3700 ms

__builtin_sqrt( ): 约 330 ms

__bulitin_sqrtf( ): 约 360ms

快了接近10倍!

那么这两个函数的区别是什么呢?

__builtin_sqrt( ) :8位

__builtin_sqrtf( ) :4位

以上有参考:https://blog.csdn.net/weixin_43731933/article/details/107344482

😃 ~~~如果还知道其他类似函数,欢迎各位评论,本人会补充~~~😃