一道程序员求职笔试题

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

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

Int foo(int x)
{

Return x&-x;

}

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

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

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

 

#include <iostream>
#include <cmath>
using namespace std;
 int foo(int x)
 {
 
return x&-x; 
 }
 

int main()
{

int x = 2^31;//这是异或操作,我是活生生的被欺骗了啊
cout << " 2^31 = "<<x<<endl;

x = pow(2,31);//这才是2的31次方,对32位系统来说,这个值是-2147483648
cout <<" pow(2,31) = "<<x<<endl;

x =2^3;
cout <<" 2^3  = "<<x<<endl;//看结果就知道是进行异或操作了

//再看下面的值,能算出是多少吗?
x = 2^31-3;
cout<< "2^31-3 = "<<x<<endl;

x= foo(x);//括号里的x初值已经是2^31-3;最终x的值是函数的返回值;

cout << "foo(x)  = "<<foo(x)<<endl;

return 0;
}


 

 

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

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

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

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值