本文用于整理一下C语言中常见的高级位操作用法
持续更新中
判断是否为奇数
判断x是否为奇数
x & 0x1
1为奇数
0为偶数
向上n整除
(x+n) & (n-1)
应用:向上4字节对齐
x = (x+4) & (4-1)
从右往左的第一个bit为1的位清0,用于判断是否为2的幂次方
x & (x-1)
0为2的幂次方
非0得到的是清除从右往左的第一个bit为1的值,例如:1010100->1010000, 1010101->1010100
应用1. 计算一个数中bit为1的个数
uint16_t get_bit1_cnt(uint16_t data)
{
uint16_t n;
for (n = 0; data; n++)
data &= (data - 1);
return n;
}
PS:在GCC中有比这个更高级的操作例如__builtin_popcount 就可以更快的计算bit为1的个数。详细可以百度内建函数(以__builtin_开头的函数)
获取从右往左的第一个1所表示的值
x & (-x)
例如:
1010 1100b 得到的值为 100b 即十进制的4
0101 0000b 得到的值为1 0000b 即十进制的16