今天看了阿里的一道笔试题:
如下函数,在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,原因何在??
异或的运算级没有算术运算级高,先进行了算术运算,再进行的异或操作!