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