[STM32F1] 怎么实现除以3的运算

[复制链接]
1955|39
llia 发表于 2023-2-18 12:51 | 显示全部楼层
很底层的知识 学习到了很多
 楼主| huwr 发表于 2023-2-18 12:52 | 显示全部楼层
又见高手,厉害,大家的智慧聚集在一起,牛X大了。
llia 发表于 2023-2-18 12:54 | 显示全部楼层
魔数除法,基本上汇编指令1乘法+1移位就可以了,效率都精度不错的:
0xAAAAAAAB、0x66666667、0x24924925、0x51EB851F、0x10624DD3...(3,5,7,...)
例如:
int32 divby3(int32 x)  
{  
    return ((int64) x*0xAAAAAAABUL) >> 33 ;
    //返回高32位右移一位
}  
也可以缩短下0xAAAAAAAB,精简点为0xAAAB, 根据数据位宽来优化下
yinxiangh 发表于 2023-2-18 12:55 | 显示全部楼层
额除以4为基础来做运算可能会更好一点 但是想了半天也不知道怎么弄
pangb 发表于 2023-2-18 12:57 | 显示全部楼层
按照手算除法的模式写的

//r=a/b
uint16_t a_div_b(uint16_t a, uint16_t b)
{
    uint16_t r = 0,i=1;
    if(b == 0)
        return 0xffff;
    while(!(b&0x8000))
    {
        b = b<<1;
        i = i<<1;
    }
    while(i>0)
    {
        if(a>=b)
        {
            r |= i;
            a = a-b;
        }
        b = b>>1;
        i = i>>1;
    }
    return r;
}
 楼主| huwr 发表于 2023-2-18 12:58 | 显示全部楼层
不太了解汇编指令
wenfen 发表于 2023-2-18 13:00 | 显示全部楼层
呵呵呵 好像是的
dengdc 发表于 2023-2-18 13:02 | 显示全部楼层
用c语言没有问题啊
ousj 发表于 2023-2-18 13:03 | 显示全部楼层
如果是256位数除以256位数,c语言的除法能做吗?
llia 发表于 2023-2-18 13:04 | 显示全部楼层
如果数非常大,超出的c语言支持的数据类型范围,这时候只能用汇编写了。
morrisk 发表于 2023-2-18 13:05 | 显示全部楼层
直接除法不可以吗
xxmmi 发表于 2023-2-18 13:06 | 显示全部楼层
还能有这个说法?
wenfen 发表于 2023-2-18 13:07 | 显示全部楼层
有很多种算法的啊
wenfen 发表于 2023-2-18 13:09 | 显示全部楼层
移位计算 就行
kangzj 发表于 2023-2-18 13:10 | 显示全部楼层
除以3的话就有点麻烦了
chuxh 发表于 2023-2-18 13:16 | 显示全部楼层
原来有这么多解决的办法
juventus9554 发表于 2023-2-18 13:17 | 显示全部楼层
如果是256位数除以256位数,直接除法能做吗?
kangzj 发表于 2023-2-18 13:19 | 显示全部楼层
如果数非常大,超出了IDE的c语言支持的数据类型范围,这时候只能用汇编写了。
SantaBunny 发表于 2023-2-19 21:23 | 显示全部楼层
求和运算
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部