int hjdfunc(int nX, int nY)
{
return(nX&nY+((nX^nY)>>1)));
}
问:hjdfunc(50, 70)返回多少?
不能用笨办法,把50、70转成2进制。
(nX+nY)/2,可以考虑成:
(1)两个2进制数先把都是‘1’的位相加再除以2;
(2)把不同的位上相加,即‘0’对应‘1’,然后再除以2;
(3)前两部分相加,得到结果。
nX&nY,实际上是把50、70的2进制形式里,相同的‘1’加起来后除以2,因为两个'1'变成了1个’1‘。例如:0100 & 1100,得到0100,其中第3位2个‘1’得到1一个‘1’。
nX^nY,按位异或,即把两个2进制数,按位不相同的部分相加了,再右移一位,相当于除以2。
综合起来,两部分加就是(nX+nY)/2。好处是不会溢出。例如两个整数相加,尽管平均值不超界,但是先求和,有可能超界。