高效位运算:__builtin_系列函数
一系列很好用的函数?时间复杂度大概是 \(O(1)\)?
- 返回x的最后一位1的是从后向前第几位,比如114514(11011111101010010)返回 2。
int __builtin_ffs (unsigned int x)
- 返回前导的 0 的个数。
int __builtin_clz (unsigned int x)
- 返回后面的 0 个个数,和
__builtin_clz
相对,比如1919810(111010100101101000010)返回 1。
int __builtin_ctz (unsigned int x)
- 返回二进制表示中1的个数,比如1919810(111010100101101000010)返回 10。
int __builtin_popcount (unsigned int x)
- 返回x的奇偶校验位,也就是x的1的个数模2的结果,比如1919810(111010100101101000010)返回 0。
int __builtin_parity (unsigned int x)
这些函数都有相应的 usigned long
和 usigned long long
版本,只需要在函数名后面加上 l
或 ll
就可以了,比如 int __builtin_clzll
。