c语言用位运算实现两个数平均数

c语言用位运算实现两个数平均数
对于十进制而言,向右移动一位就是除以10,
对于二进制而言,向右移动一位就是除以2,
对于八进制而言,向右移动一位就是除以8,
对于十六进制而言,向右移动一位就是除以16
因为计算机是通过二进制来计算的,知道这个规律之后我们可以编写代码

int average(intx,int y){
int c=(x+y)>1;
return c;
}

但这样编写缺点在于如果a或b已经是21亿即将溢出的数了,那么溢出的风险很高,于是我们可以y+(x-y)>>1,其实就是y-y/2+x/2=y/2+x/2
但其实这样只解决了x溢出的危险,也就是界娱乐一半溢出的风险

int average(intx,int y){
int c=y+(x-y)>1;
return c;
}

其实我们可以都进行求半来运算

int average(intx,int y){
int c=(x>>1);
int d=(y>>1);
int e=(c+d)>>1
return e;
}

但似乎这样显得非常复杂
我们可以根据二进制的运算技巧来编写在这里插入图片描述
与操作用于将进位的数除以二
异或操做用于将没有进位的位取出,我们取出的数再右移1位,最终结果相加。

int average(intx,int y){
int c=(x&y)+(x^y)>>1;
return c;
}

下面是整部分代码

#include<stdio.h>
int average(int x,int y){
int c=(x&y)+(x^y)>>1;
return c;
}
int main(){
printf("%d",average(5,35));
system("pause");
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41016462/article/details/84928354