A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhuaihuo1744 中级黑马   /  2015-10-20 12:59  /  3932 人查看  /  54 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

题目描述:对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法执行效率尽可能地高。



(方法一):
unsigned char Count(unsigned char byt)
{
unsigned char num=0;
while (byt)
{
num += (byt & 0×01);
byt >>= 1;
}
return num;
}
不管有多少个1都要循环8次,执行效率不高,但是执行该函数的时间每次都是确定的。

方法二:
直接的方法就是除以2向右移位, 逐个统计,但是用到取模和相除,这个很耗资源。
int Count(BYTE v)
{
int num=0;
while (v)
{
if (v%2==1)
{
num++;
}
v=v/2;
}
return num;
}
求余、除法很耗资源,写程序时应慎用。


方法三:
使用位操作,但是只会去统计1的个数,循环的次数是BYTE中1的个数,无需遍历。
int Count(BYTE v)
{
int num=0;
while (v)
{
v &=(v-1); //v=v&(v-1)这个操作可以直接消除掉v中的最右边的1。
num++;
}
return num;
}
循环次数与Byte中1的个数有关,但是函数执行时间不确定,不过效率比前面的要提高了很多,是不是以为这就是最佳答案了吧,告诉你:NO。


方法四:

查表法,这个的效率应该是最高的了——空间换时间。将0~255各个数中所含的1列出来,查表!!
int countTable[256]=
{
0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,
1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
};
int Count(BYTE v)
{
return countTable[v];
}
这个程序要求效率尽可能的高,显然最后一种的时间复杂度最低了O(1).执行时间也是确定的。空间换时间在某些情况下是个好的选择,比如需要频繁使用这个算法的时候,但也不是尽然,还是得视情况而定。

54 个回复

正序浏览

还没学这么深,感觉好难。。
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
表示只记得按位与这个方法了,受教了
回复 使用道具 举报
453702877 来自手机 中级黑马 2015-12-1 13:18:56
52#
这是面试题???
回复 使用道具 举报
只想说  面试题这样的是够变态的。。。。
回复 使用道具 举报
难,到时候面试怎么办!
回复 使用道具 举报
不懂真不懂。。。
回复 使用道具 举报
反正我是看不懂
回复 使用道具 举报
加点注释就好。。。
回复 使用道具 举报
支持 顶下
回复 使用道具 举报
这是什么啊?怎么这么复杂呢?
回复 使用道具 举报
这么屌的题目都有吗?  让菜鸟们咋整呢
回复 使用道具 举报
这是面试题?黑马的还是应聘公司,有点虚呀!
回复 使用道具 举报
陌忆 中级黑马 2015-11-10 16:49:26
42#
没看懂最后的那个表
回复 使用道具 举报
不明觉厉
回复 使用道具 举报
要是多来几个这样的题 那直接没戏了
回复 使用道具 举报
num += (byt & 0×01);
byt >>= 1;
这句没看懂,求解
回复 使用道具 举报
学习一下
回复 使用道具 举报
kongfq 中级黑马 2015-11-10 10:09:57
37#
有点难度,看不懂。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马