大家好,欢迎来到IT知识分享网。
例如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