关于C的面试题

今天面试,其中两道是关于硬件操作,不是特别熟,
 
求各位大虾指点一下:

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就行
永不止步步 发表于02-15 10:49 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:345377个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号