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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值