曾经遇到的一个c语言面试题

来源:本站
导读:目前正在解读《曾经遇到的一个c语言面试题》的相关信息,《曾经遇到的一个c语言面试题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《曾经遇到的一个c语言面试题》的详细说明。
简介:题目描述:对于一个字节(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).执行时间也是确定的。空间换时间在某些情况下是个好的选择,比如需要频繁使用这个算法的时候,但也不是尽然,还是得视情况而定。

提醒:《曾经遇到的一个c语言面试题》最后刷新时间 2024-03-14 00:58:30,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《曾经遇到的一个c语言面试题》该内容的真实性请自行鉴别。