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=,末尾共有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=(加空格是为了方便大家看的清楚)开头共有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=,共有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=,所以是3。
6 __builtin_sqrt( )
用法:快速开平方。
7 __builtin_sqrtf( )
用法:快速开平方。
那么他们跟 sqrt() 有什么区别呢?
做个简单测试:1到,看看耗时:
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