求两个数平均数

求两个数平均数的n种方法

第一种:(可能越界--不安全

int two_avg0(int a, int b)
{
	return (a+b)/2;
}

第二种:(优化第一种--不越界

int two_avg1(int a, int b)
{
	return a/2+b/2;
}

注意:安全是安全了,但是效率却变差了。

原因:通过Intel pentium CPU计算加减乘除指令周期比较,CPU计算加减法的速度跟位运算(与(&),或(|),非(!),异或(^))相当,计算乘法的速度比加减法慢近10倍,除法的速度比加减法慢(近20倍--8位,近30倍--16位,近40倍--32位)。算加减法读取内存数据比不算加减法读取内存数据慢,写内存比读内存慢。

第三种:(优化第二种

int two_avg2(int a, int b)
{
	return a-(a-b)/2;

}

第四种:(优化第三种)(最推荐)

int two_avg3(int a, int b)
{
	return a-((a-b)>>1);
}

第五种:(最牛逼<创新的本质>)(釜底抽薪,追根究底

int two_avg4(int a, int b)
{
	return (a&b)+((a^b)>>1);//算数移位
}
思路:位运算(反码)
           将相同的位相加,结果等于按位与(&)的两倍;
           将不同的位相加,结果等于按位异或(^)的结果.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值