位运算小技巧—求中位数

参考


公式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