一道bt的面试题
2010年10月28日
没有评论
外出招聘空闲时,大家都会交流交流自己的一些面试题。昨天听到一个很bt的题目:
不使用+ – ++ — +=运算符,如何用C++实现a+b?
我不认为这是一个好的面试题。但据说这题是为了考查思维活跃度,当成脑力练习还不错。各位先不要看答案,看看你能想到几种,不限制bt的程度。
以下是我目前为止知道的答案,欢迎补充。
- 相对优雅的答案,采用位运算,每次记进位。 (计算机专业出身的人,二进制计算、组成原理学的还不错)
int add( int i, int j ) { do{ register int x = i^j; j = (i&j)<<1; i = x; }while( j!=0); return i; } - 用地址运算 (对地址运算蛮熟悉)
char* p = (char*)a; int sum = &(p[b]);
- 用struct计算 (只能作用于编译期)
const int a = 10; const int b = 20; struct T { char ta[a]; char tb[b]; }; printf("%d", sizeof(T)); - 用字符串求长
char* p = new char[a]; memset( p, 'a',a); p[a-1]=0; char* q=new char[(uint32_t)-100]; memset(q,'b',b); q[b]=0; strcat( q, p ); printf( "%u", strlen(q));
- log( pow(2*a) * pow(2*b) ) (高中数学学的不错的)
- 用一个vector,把a,b装进去,然后调partial_sum 求和 (算的上熟悉STL)
- 用VB或者其他语言写个ActiveX,再用VC调用一把 (做过windows开发的,已经开始显得bt了)
- 写个.dll,再用C++调用一把 (做过windows下动态链接库开发)
- 写个.so,再用C++调用一下 (做过linux下动态链接库开发的)
- 内嵌汇编,调用ADD机器指令 (可能这个家伙是搞嵌入式的)
- 用原子操作
for( int i = 0; i < b; ::LockIncreament( &i ) ) { ::LockIncreament( &a ); } - 写个shellcode,在数据段内嵌机器码 (搞破解的人才会想到这个办法)