不用(a+b)/2,求两数平均值

#include <stdio.h>

int main()

{

    int a = 10;

    int b = 20;

    int aver = a-(a-b)/2;//方法1

    int aver = (a&b)+((a^b)>>1);//方法2

    printf("%d\n",aver);

    return 0; 

}

方法1很容易理解,就不解释了。

方法2:avg=a&b+((a^b)<<)都为'1'的所

a&b取出a和b二进制中都为'1'的所有位,因为相同直接相加就可以了。

a^b,a和b中有一个为'1'的所有位,一部分是a为'1',b为'0',另

一部分是为'1',a为'0',两部分加起来除以2,然后和前面的相加就可以了。