位运算内置函数以及常用用法
位运算内置函数以及常用用法
__builtin_族(默认参数是unsigned int,如果要传入unsigned long long 类型在后面添加\(ll\),例如__builtin_clzll(x))
| 函数名称 | 用法 | 结果(以10为例) |
|---|---|---|
| __builtin_clz(x) | 计算x的前导0个数 | 28 |
| __builtin_ctz(x) | 计算x的后缀0个数 | 1 |
| __builtin_popcount(x) | 计算x中有多少个1 | 2 |
| __builtin_ffs(x) | 计算x的最低位的1的位置 | 2 |
| __builtin_parity(x) | 计算x中1的奇偶性,偶数个返回0,奇数个返回1 | 0 |
特别注意:clz和ctz对于0返回的结果是未定义,所以在计算时一定要特判
因为ffs等价于ctz+1,parity也可以用popcount&1算,所以最重要的是前面三个函数
活用(int类型下):
- 计算x的二进制长度bitlen:
32-__builtin_clz(x) - 计算最高位的1的位置:
32-__builtin_clz(x)(1-based) - lowbit(x):
x&-x等价于(1<<(__builtin_ctz(x))) - highit(x)等价于
1<<(32-__builtin_clz(x)-1) - 计算log2(x):
32-__builtin_clz(x)-1
一定要记得clz和ctz对0的特判!
PS:有的人喜欢用31-***代替32-***-1,不过个人觉得后者容错率高一些

浙公网安备 33010602011771号