除10运算的快速算法

除10运算的快速算法例如A/10,原本打算通过位操作,进行除10运算,但后来发现通过简单的移位基本上无法实现除10操作。在一番搜索之后,发现了两个比较好的解决方法:1.通过乘以2^32/10的值429496729.6,十六进制表示为19999999.99999999A,取整为1999999A,然后再右移32位,达到误差基本可以忽略的一种快速计算。本方法假定了是32位的机器,故64位机器需要自己修改代码。(

大家好,欢迎来到IT知识分享网。除10运算的快速算法"

例如A/10,原本打算通过位操作,进行除10运算,但后来发现通过简单的移位基本上无法实现除10操作。

在一番搜索之后,发现了两个比较好的解决方法:

1.通过乘以2^32/10的值429496729.6,十六进制表示为19999999.99999999A,取整为1999999A,然后再右移32位,达到误差基本可以忽略的一种快速计算。

本方法假定了是32位的机器,故64位机器需要自己修改代码。(代码在AnycodeX在线编译器测试)

int32_t div10(int32_t dividend)
{
    int64_t invDivisor = 0x1999999A;
    return (int32_t) ((invDivisor * dividend) >> 32);
}

2.完全通过移位操作实现( 代码在AnycodeX在线编译器测试)

unsigned divu10(unsigned n) {
    unsigned q, r;
    q = (n >> 1) + (n >> 2);
    q = q + (q >> 4);
    q = q + (q >> 8);
    q = q + (q >> 16);
    q = q >> 3;
    r = n - (((q << 2) + q) << 1);
    return q + (r > 9);
}

关于移位操作实现更多的除法等的快速算法可以参考 Hacker’s Delight的文章

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12173.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信