发新帖我要提问
12
返回列表
打印
[应用相关]

怎么实现除以3的运算

[复制链接]
楼主: huwr
手机看帖
扫描二维码
随时随地手机跟帖
21
huwr|  楼主 | 2019-2-20 13:57 | 只看该作者 回帖奖励 |倒序浏览
又见高手,厉害,大家的智慧聚集在一起,牛X大了。

使用特权

评论回复
22
gongche| | 2019-2-20 14:00 | 只看该作者
魔数除法,基本上汇编指令1乘法+1移位就可以了,效率都精度不错的:
0xAAAAAAAB、0x66666667、0x24924925、0x51EB851F、0x10624DD3...(3,5,7,...)
例如:
int32 divby3(int32 x)  
{  
    return ((int64) x*0xAAAAAAABUL) >> 33 ;
    //返回高32位右移一位
}  
也可以缩短下0xAAAAAAAB,精简点为0xAAAB, 根据数据位宽来优化下

使用特权

评论回复
23
huanghuac| | 2019-2-20 14:03 | 只看该作者
按照手算除法的模式写的

//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;
}

使用特权

评论回复
24
huwr|  楼主 | 2019-2-20 14:07 | 只看该作者

结贴了,多谢大家讨论这么多哈,呵呵

使用特权

评论回复
25
eredewe3| | 2019-2-20 18:58 | 只看该作者
现在很少有人研究这么透了,一起学习下

使用特权

评论回复
26
xiaoqizi| | 2019-3-6 12:56 | 只看该作者
不太了解汇编指令

使用特权

评论回复
27
木木guainv| | 2019-3-6 12:58 | 只看该作者
呵呵呵 好像是的

使用特权

评论回复
28
磨砂| | 2019-3-7 08:57 | 只看该作者
用c语言没有问题啊

使用特权

评论回复
29
八层楼| | 2019-3-7 09:50 | 只看该作者
直接除法不可以吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则