求解一道华为面试题

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

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

...全文
1714 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
dahan_wangtao 2007-04-18
  • 打赏
  • 举报
回复
相右移,再让i= 1对应左移相应的位数,判断i左移一位和i右移一位值和原数值得比较,选择绝对值相对较小的
Enigmaya 2007-04-18
  • 打赏
  • 举报
回复
mark
hyk319 2007-04-18
  • 打赏
  • 举报
回复
N!肯定考的是算法的效率问题,若用递归,N较大时,效率很低的。
merlinfang 2007-04-17
  • 打赏
  • 举报
回复
一直左移就是了,左移几次判断一下就OK了
lrb809 2007-04-17
  • 打赏
  • 举报
回复
UP
WinWing 2007-04-17
  • 打赏
  • 举报
回复
位操作最简单.因为有0001=2^0,0010=2^1,0100=2^2...........
另外题目不够清楚:假如给出数字3,那么离它最近的是2还是4呢?
DraculaW 2007-04-17
  • 打赏
  • 举报
回复
2 求一个unsigned 数N的阶乘,即N!
這個基本上就是考慮溢出的情況吧 呵呵
DraculaW 2007-04-17
  • 打赏
  • 举报
回复
3 将一个unsigned char数的8bits反序

測試 for(i=0; i<4; i++) a的i-4位和 i+4位 如果相同則 不動 如不同則 取反

DraculaW 2007-04-17
  • 打赏
  • 举报
回复
4 给一个正整数,求其最相近的2的N次幂的数,如1,2,3,4,5,6,7,8,离7最近的是2的三次幂-8

int i;
while(a>>1) i++;
然后算 2^i 和 2^(i-1) 誰和 a的距離近 這也是一種解法吧
bargio_susie 2007-04-17
  • 打赏
  • 举报
回复
3.
#include <stdio.h>
#include <stdlib.h>

int main()
{
unsigned char a = 0x56;
unsigned char b = 0x80;
unsigned char c = 0x00;
int i;
for( i=0; i<8; i++)
{
if (a & 0x01)
c |= b;
b >>= 1;
a >>= 1;
}

printf("%#4X\n", c);

system("pause");
return 0;
}
linuxhaha 2007-04-17
  • 打赏
  • 举报
回复
第3题,最好用嵌入式汇编,用进位逻辑左移。
xk2y 2007-04-17
  • 打赏
  • 举报
回复
学习学习```
lkldiy 2007-04-17
  • 打赏
  • 举报
回复
回去学位操作
Jim_King_2000 2007-04-17
  • 打赏
  • 举报
回复
试试看这段代码.详细解释请看《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);

return 0;
}

这段代码只是计算x的上边界(以2的N次方为边界)。如果需要计算下边界,那么把上边界向右移一位即可。
blue_zyb 2007-04-17
  • 打赏
  • 举报
回复
为了统一起见,最好把
int n, result;
改为
unsigned int n, result;

呵呵。。。
ghaiyang 2007-04-17
  • 打赏
  • 举报
回复
受教,受教,小弟回去一一试来
blue_zyb 2007-04-17
  • 打赏
  • 举报
回复
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;
}
jixingzhong 2007-04-17
  • 打赏
  • 举报
回复
int i=7, n=0, t=i;
while(i>0){n++, i=i>>1;}
if(t & 1<<(n-2))
cout<<(1<<n)<<endl;
else cout<<(1<<(n-1))<<endl;
jixingzhong 2007-04-17
  • 打赏
  • 举报
回复
检查最高位以及倒数第二位即可,
如果倒数第二位是 1 则结果是 最高位左移一位得到结果;
否则就是最高位为所求结果。

比如7,
最高位是第三位, 倒数第二位为2,
那么结果就是 第三位+左移一位得到: 1<<3 =8
HelloWorld_001 2007-04-17
  • 打赏
  • 举报
回复
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的,楼主参考下!
加载更多回复(5)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧