__builtin 系列函数
__builtin
系列函数是 GCC 编译器提供的特殊函数,它们通常可以带来性能优化,理论上可以在 NOI 系列赛事上使用。
upd:删除了 __builtin_sqrt()
等函数,这些函数都被标准库的 sqrt()
调用。例如 sqrt()
的函数实现为:
inline _GLIBCXX_CONSTEXPR float
sqrt(float __x)
{ return __builtin_sqrtf(__x); }
由于 inline
的自动展开,所以调用 sqrt()
和 __builtin_sqrtf()
没有任何区别。
同样的,还有 __builtin_scanf()
等函数,所以你甚至可以不用 #include
实现 A+B:
main(){int a, b; __builtin_scanf("%d%d", &a, &b); __builtin_printf("%d", a+b);}
位运算相关函数
__builtin
系列函数在后面加上 ll
就可以支持 unsigned long long
了。
这些函数时间复杂度都是
int __builtin_ffs(unsigned x)
返回x
的最低的1
位,下标从1 开始。如传入0
则返回0
。int __builtin_clz(unsigned x)
返回x
从最高位开始的前导0
数量。若传入0
则返回未定义。int __builtin_ctz(unsigned x)
返回x
从最低位开始连续的0
个数。若传入0
则返回未定义。除非传入0
,否则__builtin_ctz(x)+1=__builtin_ffs(x)
。int __builtin_popcount(unsigned x)
返回x
中1
的出现次数。int __builtin_parity(unsigned x)
返回x
中1
的出现次数的奇偶,等价于__builtin_popcount(x)&1
,但比它快。
程序设计相关函数
long __builtin_expect(long a, long b)
返回a
的值,但提示编译器b
很有可能被取到,帮助编译器优化。