读书人

请问大牛们一个算法有关问题

发布时间: 2013-11-23 10:52:51 作者: rapoo

请教大牛们一个算法问题
给定一个二进制数data, 要取出对应mask_falg上值为1的位组成一个新数, 比如:

例1:
data : 10001
mask_flag 10101
这样结果就是取出data的1,3,5的数值为101,值为5

例2:
data : 10001
mask_flag 10111
这样结果就是取出data的1,2,3,5的数值为1001,值为9


有没有不需要循环, 直接通过位运算就可以得出结果的方法?
[解决办法]
对于你这个只有5位或者8位的,可以生成一个表,然后查表。
如果位数较多,就不好使用。
[解决办法]

引用:
恩,谢谢! 考虑过查表, 表要是二维的, 现在只需要8位, 但是担心后面位数多了不好扩展

Quote: 引用:

对于你这个只有5位或者8位的,可以生成一个表,然后查表。
如果位数较多,就不好使用。


想到一个查表方法,不一定比移位逐位处理快
位数比较多,表里可以同时有1的个数和最后的结果值 然后合并每个字节的结果。

[解决办法]
引用:
谢谢哈! 这个还是需要循环吧

Quote: 引用:


int lowbit(int x)
{
return (x & (-x));
}


--网上的一个函数,可以返回 x 最低位是 0 还是 1

同时右移 data 和 mask_flag,当mask_flag的最低位是1时,记录data 的最低位并计算


只是一段合用的程序,mcu 中有一个求前导零的指令,对数字的前导零进行计数,并将结果返回,虽然可能仍需用到循环,但应该可以大幅提高效率
[解决办法]
某些 mcu 中有一个求前导零的指令
[解决办法]
C++

//这个是 模仿 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,
};

读书人网 >C语言

热点推荐