本文主要是介绍《程序员面试宝典》 (xy) + ( (x^y)1 ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《程序员面试宝典》第四版39页的题:
int f(int x, int y) {
return (x & y) + ((x ^ y) >> 1);
}
//求f(334 + 995)的值
认为作者的思路不太理解的。下面给出我的思路:
对于数的二进制&、^运算,某位的运算无非就是三种情况:(1)1与1运算;(2)1与0运算;(3)0与0运算。
1与0运算
1&0结果为0, 1^0结果为1,那么只考虑^运算,该位就是1。
1与1运算
两个数的二进制运算中若某位上两个数均为1,则1&1为1, 1^1的结果为0,那么只考虑&运算,相当于(1+1)/ 2 = 1。即1与1使得该位为2,需要进位,但这里取了一半(除2)。
0与0运算
0&0为0, 0^0为0,则均不用考虑,该位为0即可。
由上面分析可得,当两个数某位均为1时,&操作会使得该位进位变为原来该位数的2倍,现在1&1使得该位为2的一半;当两个数某位不同时,&操作为0,不影响数。
而0^1为1,那么(0 ^ 1) / 2为该位数的一半。
所以,
(x & y) + ((x ^ y) >> 1);
相当于
加号左右的两部分都是原来的 一半,因此f(x, y)相当于 (x + y) / 2.
这篇关于《程序员面试宝典》 (xy) + ( (x^y)1 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!