今天面试,其中两道是关于硬件操作,不是特别熟,
求各位大虾指点一下:
1, 已知一个32位的字, 请给出一个高效的算法计算其中1的个数,可以
使用临时变量。
这个我实在没有好办法,我觉得唯一的办法就是写一个循环进行移位。
2,下面是两个变量的声明,请把那个数组初始化为零,且不能增加任何
其他变量。
unsigned char c;
int x[257];(刚才错写成256了)
这到题的那点是数组x长度为257,使用变量c进行循环的话会溢出。
我的土方法:
for(c=0; c < 255; c ++){
x[c] = 0;
x[c + 1] = 0;
}
不知道有没有其他好方法。
谢了先。
NetMD (SOAP) 于 (Wed Mar 8 22:18:02 2006) 提到:
template <typename T>
size_t foo(T t)
{
size_t ret = 0;
while (t)
{
t &= t - 1;
++ret;
}
return ret;
}
第一题有更快的算法
x是32位的数,统计x中1的个数。共log(32)五步
x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
x = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF);
第二题memset就行