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