求两个数平均数

求两个数平均数的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);//算数移位
}
思路:位运算(反码)
           将相同的位相加,结果等于按位与(&)的两倍;
           将不同的位相加,结果等于按位异或(^)的结果.

猜你喜欢

转载自blog.csdn.net/USA_AM_1966/article/details/83413898