return (x&y)+((x^y)>>1 ) 解释

时间:2022-06-16 01:12:43
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
           
int average(int x, int y)  
{   
     return (x&y)+((x^y)>>1);
}
  解释:
          (x&y)+((x^y)>>1),把x和y里对应的每一位(指二进制位)都分成三类,每一类分别计算平均值,最后汇总。其中,一类是x,y对应位都是1,用x&y计算其平均值;一类是x,y中对应位有且只有一位是1,用(x^y)>>1计算其平均值;还有一另是x,y中对应位均为0,无须计算。

下面我再分别说明一下前两种情况是怎样计算的:

x,y对应位均为1,相加后再除以2还是原来的数,如两个00001111相加后除以2仍得00001111,这是第一部分。
      第二部分,对应位有且只有一位为1,用“异或”运算提取出来,然后>>1(右移一位return (x&y)+((x^y)>>1 ) 解释,相当于除以2),即到到第二部分的平均值。
      第三部分,对应位均为零,因为相加后再除以二还是0,所以不用计算。
       三部分汇总之后就是(x&y)+((x^y)>>1)

相关文章