69,373
社区成员
发帖
与我相关
我的任务
分享
//这个是 模仿 C++库函数写的
inline unsigned int countBitsHalfByte(unsigned char x){
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
return "\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4"[x];
}
inline unsigned int countBitsByte(unsigned char x){
return countBitsHalfByte(x& 0xF) +countBitsHalfByte((x&0xF0)>>4);
}
template<typename intT >unsigned int countBits(intT x){
int n=0;
union{ intT d;unsigned char by[sizeof(x)];}v;
v.d =x;
for(int i = 0;i < sizeof(x); i++){
n +=countBitsByte(v. by[ i ]);
}
return n;
}
int32_t tab_all_1[] =
{ 0,
0x00000001,0x00000003,0x00000007,0x0000000f,0x0000001f,0x0000003f,0x0000007f,0x000000ff,
0x000001ff,0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,0x00007fff,0x0000ffff,
0x0001ffff,0x0003ffff,0x0007ffff,0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff,
};
int lowbit(int x)
{
return (x & (-x));
}
--网上的一个函数,可以返回 x 最低位是 0 还是 1
同时右移 data 和 mask_flag,当mask_flag的最低位是1时,记录data 的最低位并计算
int extract(int data, int mask)
{
int value = 0;
int i;
int j = 0;
for(i = 0; i < 32; i++)
{
if(mask & (1 << i))
{
if(data & (1 << i))
value |= 1 << j;
j++;
}
}
return value;
}