技术随笔:计算某char变量bit位为1的总数目
通过移位实现:
#include <stdio.h>
size_t func( char x )
{
x = (x & 0x55) + ((x>>1) & 0x55);
x = (x & 0x33) + ((x>>2) & 0x33);
x = (x & 0x0f) + ((x>>4) & 0x0f);
return x;
}
int main()
{
printf("%d", func('c'));
}
移位思想:
01010101 即为0X55
00110011 即为0X33
00001111 即为0X0F
首先 char是8Bit 那么通过
x = (x & 0x55) + ((x>>1) & 0x55);
这个运算加号左边计算0 2 4 6位是否为1 并且屏蔽1 3 5 7 位
加号右边计算1 3 5 7位是否为1 屏蔽 2 4 6位 丢弃0位 且char应该是unsign类型,右移即为逻辑右移高位补零不影响结果(1的数目)
这样就将这个char两位两位的分组(76,54,32,10) 每组1的个数分别保存在这些组中
x = (x & 0x33) + ((x>>2) & 0x33);
这个运算仿上进行,分组为(7654,3210) 并且将1的个数放在654,210位
最后也是一样了,放到最低4位里面 然后输出结果
其实中间有些位并没有用到.比如 第二步中的7和3位以及第三步的7654位
另一方法:
#include <stdio.h>
BitCount(char a)
{
int i,sum=0;
for(i=0;i<8;i++)
sum+=a>>i&1;
return sum;
}
void main()
{
printf("%d \n",BitCount('a'));
}
实现思想:
屏蔽除0位以外的位与1作与运算,若为1 则可知此位为1.sum的累加和即为1的个数.