看到一个牛X的:(X & Y) + ((X ^ Y) >> 1)求X和Y的平均值
思路:
把X和Y搞成二进制,按照对应的每一位的情况分为三部分:(1,1) (1,0),(0,0),并以此将X+ Y拆分为三部分
假设X = 13, Y = 27
13 :0000 1101
27 :0001 1011
第一部分:即(1,1)对应,同为一的取出来,其它位视为0,所以 0000 1001 + 0000 1001 = 0000 1001 * 2 = (0000 1001 & 0000 1001)* 2
第二部分:即(1,0)对应,将构成(1,0)的对应位取出来,其它位视为0,所以 0000 0100 + 0001 0010 = 0000 0100 ^ 0001 0010
第三部分:即(0,0)对应,都是0了,就不用计算了
所以 X + Y = (X & Y)* 2 + (X ^ Y)
(X + Y) / 2 = (X & Y) + (X ^ Y) / 2 ----> (X & Y) + ((X ^ Y) >>1)
这样做有什么好处呢?,没了相加,不产生高位溢出
这篇文章按照十进制来讲,觉得特漂亮http://blog.csdn.net/cqnuztq/article/details/8682889
按位运算符的妙用:http://blog.sina.com.cn/s/blog_73428e9a0101exc2.html