数码之家

 找回密码
 立即注册
搜索
查看: 984|回复: 9

右移3位是8的平均值这怎么算的?要是10次或上百次的和呢?也能用位移运算?

[复制链接]
发表于 2021-11-9 19:17:27 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
res = 0;
    for (i=0; i<8; i++)
    {
        res += ADCRead();                       //读取8次数据
    }
    res >>= 3;                                  //取平均值

要是10次或上百次的和呢?也能用位移运算吗

发表于 2021-11-9 19:57:48 | 显示全部楼层
右移3位就是除以8啊,你也可以右移10位,那就是除以1024了
回复 支持 反对

使用道具 举报

发表于 2021-11-9 20:09:40 | 显示全部楼层
看底的次方是多少,左移或右移一次就是多少, 10^n, 2^n, e^n
回复 支持 反对

使用道具 举报

发表于 2021-11-9 20:46:43 | 显示全部楼层
注意长度,一共就8/16/32/64位,移多了就没了。
回复 支持 反对

使用道具 举报

发表于 2021-11-9 21:19:14 | 显示全部楼层
写得很明白,循环内是叠加8次的ADC值,出了循环右移3位得到的效果就是除以8 ,那不就是平均值吗。
回复 支持 反对

使用道具 举报

发表于 2021-11-9 21:23:54 | 显示全部楼层
右移n位相当于除以2的n次方,所以右移10位相当于除以1024
除以10肯定不能用移位的方式来
这里用移位的方式肯定是想加快执行速度
回复 支持 反对

使用道具 举报

发表于 2021-11-10 09:03:22 | 显示全部楼层
右移3位就是除以8,右移1位是除以2,2位是除以4,以此类推。建议别弄这种,直接写除以8就好了,像这种一般编译器会优化的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-10 16:32:02 | 显示全部楼层
sblinux 发表于 2021-11-9 21:19
写得很明白,循环内是叠加8次的ADC值,出了循环右移3位得到的效果就是除以8 ,那不就是平均值吗。 ...

不懂的是为什么是右移3位是8的平均值
回复 支持 反对

使用道具 举报

发表于 2021-11-10 17:54:21 | 显示全部楼层
本帖最后由 595953427@qq 于 2021-11-10 17:58 编辑
uuu154 发表于 2021-11-10 16:32
不懂的是为什么是右移3位是8的平均值

假如res=0x10,二进制写作0B00010000;右移0位就是0B00010000->0x10,右移0位就是除以1,
右移1位就是0B00001000->0x08,右移1位就是除以2,
右移2位就是0B00000100->0x04,右移2位就是除以4,
右移3位就是0B00000010->0x02,右移3位就是除以8。


回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-10 22:15:25 来自手机浏览器 | 显示全部楼层
595953427@qq 发表于 2021-11-10 17:54
假如res=0x10,二进制写作0B00010000;右移0位就是0B00010000->0x10,右移0位就是除以1,
右移1位就是0B000 ...

懂了,3q
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-20 18:45 , Processed in 0.124800 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表