对求平均数的一些改进

题目:求两个数的平均值。

对于这种求平均数的问题,相比大家在初学C语言的时候就已经做过这种类型的题了,但是,对于一般的(a+b)/2的方法是有其缺陷的,那就是当a和b极大时,容易发生溢出的状况

对于这种问题,我们有一种比较丑陋的解决方案,那就是先比较a和b的大小,然后用大的减小的除以2,再加给小的。

话不多说上代码

#include<stdio.h>
int main(void){
	int a = 10;
	int b = 5;
	int num = 0;
	if (a > b){
		num = b + (a - b) / 2;
	}
	else{
		num = a + (b - a) / 2;
	}
	printf("%d", num);
	return 0;
}

除了以上这种比较丑陋的解决方案外,我们还要一种更为优雅、从容的方案,那就是用位移操作符进行运算

#include<stdio.h>
int main(void){
	int a = 10;
	int b = 5;
	printf("%d\n", (a&b) + ((a^b) >> 1));
	printf("%d\n", (b + ((a - b) >> 1)));
	return 0;
}

上面有两种不同的写法,但其实原理都是一样,先求出相同部分,再加上不同部分的一半就是平均值

举个简单的例子9(1001)和5(0101),先求相同部分(0001)再求不同部分(1100)>>1,结果为7(0111)

1001和0101求平均值的具体过程可以理解为1001+0101=0001+1000+0100+0001,(1001+0101)/2=(0001+0001)/2+(1000+0100)/2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值