首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

面试归来,速来发帖!解决办法

2012-03-27 
面试归来,速来发帖!今天的面试过程挺短客气了几句,先来个自我介绍然后那个经理人就只问了一个技术问题:十

面试归来,速来发帖!
今天的面试过程挺短
客气了几句,先来个自我介绍
然后那个经理人就只问了一个技术问题:十进制整数,计算对应的二进制数包含多少个1,用位操作。
听了半句,闪过个利用/2 %2的方法。
那经理人又说位操作实现。
于是思索了一小会儿(主要是对bitset不熟悉)说利用C++标准库bitset计算。
那经理人一听说不允许用标准库。
然后就纠结于左移右移并如何提高效率了。

回来的路上,手机查了下。
于是有这么个思路(32位为例):
1.先造表 int[256],保存1-255对应二进制数1的个数。
2.对整数a,先求a&255再查表。
3.然后(a>>8)&255再查表。
4.依次类推,处理完所有位数,将查表所得值相加。

后来想把int [256],改成char [256]节省点空间,又不知类型转换会不会有太大的副作用。
希望各位坛友给点意见,如果思路不对,也请一并指出,谢谢!

[解决办法]
这个最简单的办法是

while(a>0)
{
a=a&(a-1);
count++;
}
实际这题只是考你以前看见过没有,没看见过基本没可能想到
[解决办法]

C/C++ code
int BitCount2(unsigned int n){    unsigned int c = 0 ;    for (c = 0; n; ++c)    {        n &= (n - 1) ; // 清除最低位的1    }    return c ;}
[解决办法]
C/C++ code
int fun(int x){    x = (0x55555555 & x) + ((0xAAAAAAAA & x)>>1);     x = (0x33333333 & x) + ((0xCCCCCCCC & x)>>2);    x = (0x0F0F0F0F & x) + ((0xF0F0F0F0 & x)>>4);    x = (0x00FF00FF & x) + ((0xFF00FF00 & x)>>8);    x = (0x0000FFFF & x) + ((0xFFFF0000 & x)>>16);    return x;}int main(){        std::cout<<fun(0x0f0e0010);    system("pause");}
[解决办法]
int g(int x){
int i = 1;
int n = 0;
while(1){
if(x >= i){
if(x & i)
n++;
i = i << 1;
}
else
break;
}

return n;
}

热点排行