技术随笔:计算某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的个数.


你可能感兴趣的:(char)