求解一道华为面试题解决方案

求解一道华为面试题
面试题:
1   中断的处理过程;
2   求一个unsigned   数N的阶乘,即N!
3   将一个unsigned   char数的8bits反序
4   给一个正整数,求其最相近的2的N次幂的数,如1,2,3,4,5,6,7,8,离7最近的是2的三次幂-8

哪位大虾能给出第四道题的解法



------解决方案--------------------
比如输入的是正整数N
那么和它最近滴2^N只有两个可能:
一个是这个N滴二进制形式滴最高位是1,还有就是最高位的上一位是1
比如一个n滴二进制形式是:00011010
那么就可能是:00010000或者是00100000
然后分别和N比较,哪个差最小(也有一样滴,比如3)哪个就满足!!


不知道这种思路怎么样?
------解决方案--------------------
#include <stdio.h>

int fun(int s)
{
int d=s;
int i=1;

while (d> > =1) i < <=1;

if ((s-i)> =(i> > 1)) return i < <1; //如果6最接近的是4则为 '> ',最接近的是8则为 '> = '
else return i;
}

void main()
{
int n;
scanf( "%d ",&n);

printf( "result:%d\n ",fun(n));
return 0;
}

------解决方案--------------------
void main()
{
int m,n,x;
scanf( "%d ",&x);
m=1;
while(m <x)
{n=m;m=m*2;}
if((x-n) <(m-x))
printf( "%d ",n)
else printf( "%d ",m);

}
------解决方案--------------------
class Test041702 {
public static void main(String srgs[]) {
int iNear=100;//你需要判断的数
int i=0;
for(i=0;i <iNear;i++){
if(power(2,i)> iNear)//找到第1次大于iNear的值
break;
}
int i1=iNear-power(2,i-1);
int i2=power(2,i)-iNear;
if(i1> i2)
System.out.println( " "+i);
if(i1 <i2)
System.out.println( " "+(i-1));
}
public static int power(int m,int n){//m^n
if(n==0)
return 1;
else if(n==1)
return m;
else
return m*power(m,n-1);
}
}

写个java的,楼主参考下!

------解决方案--------------------
检查最高位以及倒数第二位即可,
如果倒数第二位是 1 则结果是 最高位左移一位得到结果;
否则就是最高位为所求结果。

比如7,
最高位是第三位, 倒数第二位为2,
那么结果就是 第三位+左移一位得到: 1 < <3 =8
------解决方案--------------------
unsigned int getNearestPowerOf2(unsigned int x)
{
unsigned answer = 0;
unsigned int mask = (1 < < (sizeof(int) * 8 - 1));

while ( !(x & mask))
mask > > = 1;

if (x & (mask > > 1))
answer = (mask < < 1);
else
answer = mask;

return answer;
}

int main()
{
int n, result;
scanf( "%d ",&n);

result = getNearestPowerOf2(n);
if (result)
printf( "result:%x\n ",getNearestPowerOf2(n));
else
printf( "overflow!\n ");

return 0;
}

------解决方案--------------------
试试看这段代码.详细解释请看《Hacker 's delight》

#include <stdio.h>


#define upper_bound_32(x) \
do\
{\
x |= x > > 1;\
x |= x > > 2;\
x |= x > > 4;\
x |= x > > 8;\
x |= x > > 16;\
++x;\
} while (0)


int main()
{
unsigned long x = 9;
upper_bound_32(x);
printf( "%lu\n ", x);