首页 > 试题广场 >

请问 func(0x11530828)的返回值是?

[填空题]
 int func(unsigned int i) {
unsigned int temp = i;
 temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa) >> 1);
 temp = (temp & 0x33333333) + ((temp & 0xcccccccc) >> 2);
 temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0) >> 4);
 temp = (temp & 0x00ff00ff) + ((temp & 0xff00ff00) >> 8);
 temp = (temp & 0x0000ffff) + ((temp & 0xffff0000) >> 16); 
 return temp;
 }
请问 func(0x11530828)的返回值是:1
推荐
首先确定这个题是想考察数的二进制表示中1的个数的“平行算法”,然后对代码两处笔误出进行改正如下:
1、 temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0 >> 4)); 
改为: temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0) >> 4); 
2、 temp = (temp & 0xff00ff) + ((temp & 0xff00fff00) >> 8);
改为: temp = (temp & 0xff00ff) + ((temp & 0xff00ff00) >> 8);
接下来开始分析改算法是如何实现二进制表示中1的个数统计的,为了方便理解,我们把代码改成如下的形式:
int func(unsigned int i)
{
    unsigned int temp = i;
    temp = (temp & 0x55555555) + ((temp>> 1) & 0x55555555);  //temp相邻位相加  
    temp = (temp & 0x33333333) + ((temp >> 2) & 0x33333333);  //temp相邻(以2为单位)相加
    temp = (temp & 0x0f0f0f0f) + ((temp>> 4) & 0x0f0f0f0f);    //temp相邻(以4为单位)相加
    temp = (temp & 0xff00ff) + ((temp>> 8) & 0xff00ff);       //temp相邻(以8为单位)相加
    temp = (temp & 0xffff) + ((temp>> 16) & 0xffff) ;          //temp相邻(以16为单位)相加
    return temp;
}
temp相邻位相加:相加原理若相邻的两个数为00则结果为00, 相邻的两个数为01或10则结果为01,相邻两个数为11则结果为10,也就是先小范围统计每两位中1的个数,后面的步骤在累计有多少个1.
0x11530828的二进制表示如下:
0001  0001 1001 0011 0000 1000 0010 1000;
0  1    0  1   1  1   0  2   0  0   1  0   0  1   1  0;
  1         1       2      2        0      1        1      1;
        2                 4                1                    2 
                  6                                    3
                                    9
编辑于 2015-09-05 22:22:05 回复(16)
平行法计算二进制中1的个数,二进制中利用相邻位相加,直到最后剩下一个数,求出1的个数。
举例:
求255(1111 1111)二进制中1的个数。
1 1 1 1   1 1 1 1
  2    2     2    2
     4           4
            8
将255的8个位置进行编号,1号位置到8号位置,首先对12、34、56、78进行相加,得到2、2、2、2,分别存放于12、34、56、78位置,再将12、34、56、78看成一个整体,将12和34、56和78相加,得到4、4存放于1234、5678位置,最后再将1234和5678相加,得到8。算法也是利用了二分的思想,给定一个二进制数,将均分成两部分,分别求左边和右边的1的个数,然后相加,最后得到结果。
发表于 2015-08-11 09:42:37 回复(0)
二进制平行算法,用于计算1的出现次数,直接计算0x11530828的1的出现次数,1+1+2+2+1+1+1=9
发表于 2016-08-31 03:35:19 回复(0)
各位大神,这样的题目如果第一次见到,怎么着手做?求指点
发表于 2015-08-01 18:21:08 回复(5)
求数的二进制表示中1的个数的“平行算法”,思路就是先将n写成二进制形式,然后相邻位相加,重复这个过程,直到只剩下一位。
发表于 2015-07-30 15:47:30 回复(0)
这题说实话没什么意思,知道代码含义的人不用看代码也知道结果;不知道代码含义的人就靠硬算了。
发表于 2016-04-10 20:37:24 回复(0)
看着这种题就头疼。。
发表于 2017-07-09 11:07:21 回复(0)
http://www.cnblogs.com/biyeymyhjob/archive/2012/08/16/2642309.html
发表于 2017-05-14 21:56:29 回复(0)
绑定这个题。关于求解一个数的二进制的1的个数,目前:①位运算②平行算法。
发表于 2017-03-08 21:05:46 回复(0)
运行结果为9,计算二进制中1的个数,把这个数化为二进制,最后结果为9个1
编辑于 2017-03-18 10:30:59 回复(0)
右移操作符刚好换行了,看不到
发表于 2016-10-27 09:14:28 回复(0)
题目好难哦
发表于 2016-07-02 09:49:16 回复(0)
一步一步算,算出来结果是9,但是这个到底是什么算法呢?考察什么?没看出来
发表于 2015-10-23 15:36:49 回复(0)
貌似看清题目按位运算,然后蛮力法解吧~ 没啥特别的。
发表于 2015-09-13 17:20:22 回复(0)
int func(unsigned int i)
{
    unsigned int temp = i;
    temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa) >> 1);
    temp = (temp & 0x33333333) + ((temp & 0xcccccccc) >> 2);
    temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0) >> 4);
    temp = (temp & 0x00ff00ff) + ((temp & 0xff00ff00) >> 8);
    temp = (temp & 0x0000ffff) + ((temp & 0xffff0000) >> 16);
    return temp;
}
发表于 2015-08-27 19:24:46 回复(0)
答案给的是1032,什么鬼???
发表于 2015-08-24 17:04:21 回复(0)
代码运行结果是1032,复制粘贴的代码。
发表于 2015-08-15 12:18:06 回复(1)
利用相邻位相加求二进制中1的个数
发表于 2015-07-17 10:31:20 回复(2)
这是什么算法?求什么数的
发表于 2015-06-22 14:59:15 回复(0)
每一位都求位与运算

发表于 2015-06-21 18:03:55 回复(0)
代码运行结果是9
发表于 2014-10-25 00:26:03 回复(1)