#define BIT(x) (1 << (x)) // BX_(X):以4bit为一个单位进行BIT_COUNT,在此基础上16进制. // 以一个4bit的数据x = abcd为例,其中a~d为0或1 // x = 8a + 4b + 2c + d // x>>1 = 4a + 2b + c // x>>2 = 2a + b // x>>3 = a // BX_(x) = x - (x>>1) - (x>>2) - (x>>3) = a + b + c + d #define BX_(x) ((x) - (((x)>>1)&0x77777777) - (((x)>>2)&0x33333333) - (((x)>>3)&0x11111111)) // BITCOUNT(x) = sum( 0x000_000f & (BX_(x) >> (i*4)) ),其中sum()表示求和运算,i的取值为0~7。 // 如果x是一个16位的数,比如abcd,其中a~d代表一个4bit的数。 // BX_(abcd) = efgh, BITCOUNT 应该等于 e+f+g+h // 则BITCOUNT(abcd) = ((efgh + 0efg ) & 0x0f0f) %0xff // = 0j0k % 0xff ,其中j= e+f, k = g+h // = j+k = e+f+g+h // 如果x是一个32位的数,比如ijkl_mnop,则BX_(ijkl_mnop)=abcd_efgh,需要证明 BITCOUNT = sum(a,h) // BITCOUNT(x) = ((abcd_efgh + 0abc_defg) & 0x0f0f_0f0f) % 0xff // = 0q0r0s0t % 0xff, 其中 q=a+b,r=c+d, s=e+f, t=g+h // = q+r+s+t = sum(a,h) // 功能:将所有位相加。比如1110 0011 =1+1+0+0+0+1+1+1=5 #define BITCOUNT(x) (((BX_(x)+(BX_(x)>>4)) & 0x0F0F0F0F) % 255)



