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
也没想那么多,觉得需要借助计算机编程才能得到答案!
事实上呢,看看下面的程序和结果,你就明白了!
- #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,原因何在??
异或的运算级没有算术运算级高,先进行了算术运算,再进行的异或操作!