存档

文章标签 ‘interview’

一道bt的面试题

2010年10月28日 没有评论

外出招聘空闲时,大家都会交流交流自己的一些面试题。昨天听到一个很bt的题目:

不使用+ – ++ — +=运算符,如何用C++实现a+b?

我不认为这是一个好的面试题。但据说这题是为了考查思维活跃度,当成脑力练习还不错。各位先不要看答案,看看你能想到几种,不限制bt的程度。

以下是我目前为止知道的答案,欢迎补充。

 

  1. 相对优雅的答案,采用位运算,每次记进位。 (计算机专业出身的人,二进制计算、组成原理学的还不错)
    int add( int i, int j )
    {
        do{
            register int x = i^j;
            j = (i&j)<<1;
            i = x;
        }while( j!=0);
        return i;
    }
  2. 用地址运算 (对地址运算蛮熟悉)

    char* p = (char*)a;
    int sum = &(p[b]);
  3. 用struct计算 (只能作用于编译期)

    const int a = 10;
    const int b = 20;
    struct T { char ta[a]; char tb[b]; };
    printf("%d", sizeof(T));
  4. 用字符串求长
    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));
  5. log( pow(2*a) * pow(2*b) )  (高中数学学的不错的)
  6. 用一个vector,把a,b装进去,然后调partial_sum 求和 (算的上熟悉STL)
  7. 用VB或者其他语言写个ActiveX,再用VC调用一把 (做过windows开发的,已经开始显得bt了)
  8. 写个.dll,再用C++调用一把 (做过windows下动态链接库开发)
  9. 写个.so,再用C++调用一下 (做过linux下动态链接库开发的)
  10. 内嵌汇编,调用ADD机器指令 (可能这个家伙是搞嵌入式的)
  11. 用原子操作
    for( int i = 0; i < b; ::LockIncreament( &i ) )
    {
      ::LockIncreament( &a );
    }
  12. 写个shellcode,在数据段内嵌机器码 (搞破解的人才会想到这个办法)
分类: 其他 标签: