不使用除法或强制转换将整数除以 16
好吧...让我重新表述一下这个问题...
如何在不使用除法或转换为 double 的情况下获得整数的 x 16ths...
OKAY... let me rephrase this question...
How can I obtain x 16ths of an integer without using division or casting to double....
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
(但是有点担心溢出。 ref 和 frac 能得到多大?如果可能溢出,首先转换为更长的整数类型)
(but worry a a bit about overflow. How big can ref and frac get? If it could overflow, cast to a longer integer type first)
在任何此类运算中,先乘后除是有意义的。现在,如果您的操作数是整数并且您使用的是可编译语言(例如 C),请使用 shr 4 而不是 /16 - 这将节省一些处理器周期。
In any operation of such kind it makes sense to multiply first, then divide. Now, if your operands are integers and you are using a compileable language (eg. C), use shr 4 instead of /16 - this will save some processor cycles.
假设这里的所有内容都是整数,任何有价值的优化编译器都会注意到 16 是 2 的幂,并相应地移动 frac —— 只要优化打开。更多地担心编译器无法为您完成的主要优化。
如果有的话,您应该将
ref * frac
括起来,然后进行除法,因为任何小于 16 的 frac 值都将得到 0,无论是通过移位还是除法。Assuming everything here are ints, any optimizing compiler worth its salt will notice 16 is a power of two, and shift frac accordingly -- so long as optimizations are turned on. Worry more about major optimizations the compiler can't do for you.
If anything, you should bracket
ref * frac
and then have the divide, as any value of frac less than 16 will result in 0, whether by shift or divide.您可以使用左移或右移:
You can use left shift or right shift:
我不明白这个约束,但是这个伪代码四舍五入(?):
I don't understand the constraint, but this pseudo code rounds up (?):