多种方法求平均数
2017-12-13 18:34
85 查看
求两个数的平均数最常用的方法就是(a+b)/2,不过这种方法很容易溢出,原因是由于整形数据存储中,以补码形式存储,整型的取值范围为:
unsigned int :0~2^32-1
signed int : -2^31~2^31-1
所以当两个很大的数相加时就会溢出。
提出第二种方法:
怎么理解呢?其实很简单,比如x有5块钱,y有10块钱,要想我们两个人的钱数相等,只需要将y比x多的一部分平分然后加上x与y共同拥有的部分。
但是实际上,这种方法还是会有缺陷,如果数据足够大的话,有溢出的可能性。
所以提出最后一种解决方法:
这种方法与上面的方法理解是相同的,操作有所不同,这里采用的是位操作符,对比特位直接进行运算。
x&y 即是把x与y中相同的部分取出。
(x^y)是不同的部分取出,右移一位等价于/2.
这种情况不会溢出,原因是我们直接对比特位进行操作,并且也没有对比特位左移操作,所以不会溢出,相反我们对比特位进行右移数据只会越变越小。
综上所述:在求两数平均数时,推荐第三种解法更为稳妥。
unsigned int :0~2^32-1
signed int : -2^31~2^31-1
所以当两个很大的数相加时就会溢出。
提出第二种方法:
printf("avg = %d\n", x+(y-x)/2);//分不同的部分
怎么理解呢?其实很简单,比如x有5块钱,y有10块钱,要想我们两个人的钱数相等,只需要将y比x多的一部分平分然后加上x与y共同拥有的部分。
但是实际上,这种方法还是会有缺陷,如果数据足够大的话,有溢出的可能性。
所以提出最后一种解决方法:
printf("avg = %d\n", (x&y)+(x^y)>>1);//xy相同部分取出来+(不同的部分)一分为二 不会溢出
这种方法与上面的方法理解是相同的,操作有所不同,这里采用的是位操作符,对比特位直接进行运算。
x&y 即是把x与y中相同的部分取出。
(x^y)是不同的部分取出,右移一位等价于/2.
这种情况不会溢出,原因是我们直接对比特位进行操作,并且也没有对比特位左移操作,所以不会溢出,相反我们对比特位进行右移数据只会越变越小。
综上所述:在求两数平均数时,推荐第三种解法更为稳妥。
相关文章推荐
- 使用多种方法求两个数的平均数
- SQL把一个表中数据更新到另一个表的多种方法
- Shell脚本判断IP是否合法性(多种方法)
- 多种电脑定时关机方法教您怎么定时关机
- SQL语句的添加、删除、修改多种方法
- Appium定位控件的多种方法
- jquery判断元素是否隐藏的多种方法
- android TextView的字体颜色设置的多种方法
- 系统中多种隐藏超级用户administrator的方法
- 基于Oracle&Hibernate&Spring,集合了多种常用方法,方便调用
- Centos下多种PHP拓展安装方法
- 元素居中浏览器的多种方法集锦
- jquery自定义函数的多种方法
- 使用javascript打开链接的多种方法
- 用户最关注的多种数据用什么方法展现
- 单链表逆序 多种方法总结
- linux多种安装包格式的安装方法
- List 集合去重合并 , 多种方法演示
- linux下命令取IP地址的多种方法
- MySQL学习笔记1:安装和登录(多种方法)