用的是位运算
int avg=(x&y) +((x^y)>>1);
x&y 取出x和y二进制都为‘1’的所有位
x^y x和y中有一个为‘1’的所有位
(x^y)>>1 除以2
就是把x和y都分成两部分,
一部分是都为‘1’的部分,因为相同,所以直接加就行了
一部分是x为‘1’,y为‘0’的部分,以及y为’1‘,x为’0‘的部分,两部分加起来除以2,然后跟前面的相加就可以了
ps:如上为一个帖子中牛人的回复,特此记录。
类似的位运算,判断当前给定的一个字节只有一位1
if (0 == (x & (x - 1)))
就可以判断出了。但是当给定字节为0时,就有问题了,所以需要再判断一下是否为0
if (0 != x)
if (0 == (x & (x - 1)))
然后对这个位运算扩展以后,就可以判断当前给定的字节包含多少个1