首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

2道面试题,帮小弟我解释一下吧

2012-02-29 
2道面试题,帮我解释一下吧?1求定义的常数M,N#defineM//?#defineN//?intfun1(intx,inty){intresx*M+y/Nre

2道面试题,帮我解释一下吧?
1   求定义的常数M,N

#define   M   //?
#define   N   //?

int   fun1(int   x,   int   y)
{
int   res   =   x*M   +   y/N;

return   res;
}
//函数fun1经编译器优化乘法和除法后的汇编代码翻译为fun2
int   fun2(int   x,   int   y)
{
int   t   =   x;
x   < <=   4;
x   -=   t;

if   (   y   <   0)
y   -=   3;
y   > > =   2;

return   x+y;
}

//求M和N?

2.A,B处assert用法有什么问题?
void   fun1(const   char*   pfile)
{
          FILE*   stream;
          assert(   NULL   !=   pfile   );   //A

          stream   =   fopen(pfile,   "+w ");
          assert(   NULL   !=   stream);   //B

          ......

}

[解决办法]
1:
M = 15
N = 4
2:
B处不应该用assert,应该用if判断:
3:
g_nOut = 133;
//如果在这里被中断,而且改了g_nOut,那返回的不是133
return g_nOut;

[解决办法]
int res = x*M + y/N;

int t = x;
x < <= 4;
x -= t;

x左移4位,即x=16x,再减去本身,再赋给x,即x=16x-x=15x => M=15

if ( y < 0)
y -= 3;
y > > = 2;

右移2位,y=y/4=> N=4

[解决办法]
1.
int res = x*M + y/N;

int t = x;
x < <= 4;
x -= t;

x左移4位,即x=16x,再减去本身,再赋给x,即x=16x-x=15x => M=15

if ( y < 0)
y -= 3;
y > > = 2;

右移2位,y=y/4=> N=4


2.A,B处assert用法有什么问题?
void fun1(const char* pfile)
{
FILE* stream;
assert( NULL != pfile ); //A

stream = fopen(pfile, "+w ");
assert( NULL != stream); //B
}

用if 来判断更加灵活


3. 在多线程下函数有什么问题?
int g_nOut;
int fun(int nInput)
{
g_nOut = 133;
return g_nOut;
}

缺少对g_nOut变量的保护,若同步出问题,返回将不是g_nOut的值,而是另一线程的g_nOut
[解决办法]
1.int fun2(int x, int y)
{
int t = x;
x < <= 4;
x -= t;//x*(2^4-1)

if ( y < 0)
y -= 3;
y > > = 2;//y/(3)

return x+y;
}

2.两处都不必用
一处常指针为空编译不过去
二处应用if或异常机制


[解决办法]
1. 求M和N
M=15,上面都写了,就是x先*16,然后减去原来的x,所以M=15;
N我感觉肯定不是4,因为有个判断y是否小于0,上面似乎都没有解释
if(y <0)
{
y-=3;
}
y> > =2;
对于N,期待有高人回答。除法比较困难,主要是对于无法整除的情况,会舍去余数。

2.A处,此时指针刚刚分配,怎么可以assert呢,assert也没有意义
B处,使用if判断处理,而一般不使用assert

3.上面大家都说的很对,此函数无法重入,否则变量的值无法预料。
[解决办法]
if(y <0)
{
y-=3;
}
y> > =2;


y <0,y=- (y/N) +y%N=-(y/N)+y> > N
y> 0,y=y/4
要让-(y/N)+y> > N=y/4
=> -y/N+y/(2^N)=y/4
=> -4*2^N+4*N=n*2^N
=> (N+4)*2^N=4*N


------解决方案--------------------


假设M是个负数(M <0),N是个正数(N> 0),除数是X,余数是Y ==> M = N*X + Y;
其中X <0, Y的范围在[0,N);
为了保证余数是正数,除数不能简单的等于-|M|/N,而需要等于-|M-(N-1)|/N;
由于题目中当y <0进行了-3处理,在加上后面的移二位的操作,可以断定这里N =4
这样除数就等于-|M-3|/4。
[解决办法]
我查阅了一些书籍,在 <计算机系统> 这本书中,我找到了一些标准的答案:
1.准确的公式应该是:
(x <0 ? (x+(1 < <k)-1) : x) > > k;
2.这里右移应该是算数右移。
[解决办法]
if ( y < 0)
y -= 3;

应该写成:

if ( y < 0)
y += 3;



比如:

yy> > =2y+3y+3> > 2y/4
-1-1200
-2-1100
-3-1000
-4-1-1-1-1
-5-1-2-1-1

热点排行