参考
公式1 (x & y) + ((x ^ y) >> 1) 结果时向下取整
这样求X,Y的平均值时就不会出现int或long long超出范围的情况了,并且精度不丢失
若先x+y可能会超出范围
在二分时求mid = (l + r) / 2, 用这种方法很好!
推导
因为二进制数字都是一串0和1,那么可以把整数x和y都看作是一个有很多不同的0和1组成的集合。

求这两个集合的平均值就是 交集+差集的一半
交集:x&y
差集的一半:x^y >>1

公式2 (x | y) - ((x ^ y) >> 1) 结果时向上取整
求这两个集合的平均值就是 并集 - 差集的一半
并集:x|y
差集的一半:x^y >>1