一道阿里巴巴笔试题

http://blog.csdn.net/hehainan_86/article/details/11826905

今天看了阿里的一道笔试题:

如下函数,在32bit系统foo(2^31-3)的值是:

Int foo(int x)
{

Return x&-x;

}

A: 0   B: 1  C:2  D:4

也没想那么多,觉得需要借助计算机编程才能得到答案!

事实上呢,看看下面的程序和结果,你就明白了!

 

  1. #include <iostream>  
  2. #include <cmath>  
  3. using namespace std;  
  4.  int foo(int x)  
  5.  {  
  6.    
  7. return x&-x;   
  8.  }  
  9.    
  10.   
  11. int main()  
  12. {  
  13.   
  14. int x = 2^31;//这是异或操作,我是活生生的被欺骗了啊  
  15. cout << " 2^31 = "<<x<<endl;  
  16.   
  17. x = pow(2,31);//这才是2的31次方,对32位系统来说,这个值是-2147483648  
  18. cout <<" pow(2,31) = "<<x<<endl;  
  19.   
  20. x =2^3;  
  21. cout <<" 2^3  = "<<x<<endl;//看结果就知道是进行异或操作了  
  22.   
  23. //再看下面的值,能算出是多少吗?  
  24. x = 2^31-3;  
  25. cout<< "2^31-3 = "<<x<<endl;  
  26.   
  27. x= foo(x);//括号里的x初值已经是2^31-3;最终x的值是函数的返回值;  
  28.   
  29. cout << "foo(x)  = "<<foo(x)<<endl;  
  30.   
  31. return 0;  
  32. }  


 

 

明白异或操作的话,这个问题就很简单了,

异或操作:按位进行异或,对应的位相同,当前位结果为0,不同即为1。

如用4位来表示, 1 1 0 0 与 0 1 1 0进行异或操作,结果将是1 0 1 0,对应的10进制结果就是10.

下面就揭晓上面代码的答案吧。

有没有发现阿里笔试题的答案竟然是2,原因何在??

异或的运算级没有算术运算级高,先进行了算术运算,再进行的异或操作!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值