3.求两个数的平均值。
求两个数的平均数是,往往会想到的是(a+b)/2,但这样算存在一定的缺陷,当a,b为两个比较大的数字时,这样的方法就会出错;那到底有没有更好的方法呢?答案是肯定的,如下两种方法:
#include<stdio.h>
int main()
{
int a=7;
int b=5;
int aver=(a&b)+((a^b)>>1);//法一:数字在内存中是以补码的形式存储的,两个数之和就等于
//相同位之和的1/2加不同为之和,a^b就是他们不同位之和
int aver=a+(b-a)<<1;//法二:a加上b比它多的那部分的1/2
printf("%d\n",aver);
return 0;
}
4.一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
#include<stdio.h>
int main()
{
int arr[]={1,1,2,2,3};
int i=0;
int sz=sizeof(arr)/sizeof(arr[0]);
int ret=0;
for(i=0;i<sz;i++)
{
ret^=arr[i];
}
printf("ret=%d\n",ret);
return 0;
}