Java 为什么在BER编解码器中使用Math.floor()代替整数除法
我正在看SNMPBEECodec,可以在这里看到Java 为什么在BER编解码器中使用Math.floor()代替整数除法,java,encoding,snmp,Java,Encoding,Snmp,我正在看SNMPBEECodec,可以在这里看到 我特别关注的是函数encodeLength() 我感兴趣的一个片段 int numBytes = 0; int temp = length; while (temp > 0) { ++numBytes; temp = (int)Math.floor(temp / 256); } (摘自) 我想知道为什么使用
我特别关注的是函数
encodeLength()
我感兴趣的一个片段
int numBytes = 0;
int temp = length;
while (temp > 0)
{
++numBytes;
temp = (int)Math.floor(temp / 256);
}
(摘自)
我想知道为什么使用
Math.floor()
而不是像temp/256这样的简单整数除法。看来简单的整数除法也会得到同样的结果。还是有技术上的差异?要回答问题的技术部分:
使用math.floor()
是多余的:temp/256
是一个整数(根据Java的整数算术规则),对整数使用math.floor()
是毫无意义的。您可以简单地使用temp/256
不了解他们的想法,就无法回答作者为什么这样做。作者可能只是对Java中除法的行为感到困惑,并决定“谨慎行事”——但这只是猜测。好吧,不幸的是,作者也无法读懂自己的心思了——我写这篇文章已经有12年了,所以我忘了我不使用整数除法的原因。一些想法:我在其他地方使用整数除法,假设是通常的行为,因此不太可能对Java中的整数除法规则产生基本的混淆;有可能(尽管不太可能)我在某个时候使用了非整数数据类型作为参数,并且在我更改时没有去掉多余的floor();或者(更有可能)在开发算法时,我曾试图向上取整,而不是向下取整,使用ceil()作为一种廉价的(=更少的字符)方法来实现这一点,当我改变时,我只是本能地切换到floor()
所以不幸的是,真正的原因消失在时间的迷雾中。。。但我同意,发言是多余的。我真的应该把代码发布在Github或类似的网站上,这样人们就可以改进和改进它。
\
Jon@EJP:不,一般来说,这样的代码可能有很好的技术原因。理解这个原因可能非常有趣。然而,情况并非如此。但是,您只能通过询问您是否不了解自己来发现。它们不是严格等效的:但是,因为在您的示例中temp大于0,所以它是等效的。我问这个问题的原因是因为Drexel库对于SNMP非常流行。我想知道我是否有明显的遗漏。似乎是no@EJP我认为真正的问题是:他们是否等同于amd,如果他们是,那么哪一个“更好”。@EJP:好的观点。我编辑了这个问题,试图让它更清楚,因为我认为这是一个有效的问题。希望这会有帮助。你们有可能是在尝试实施“地板分割”吗?负数则不同:-1
楼层划分8
是-1
而不是0
。如果您编写的是256.0
而不是256
,那么您将拥有一个工作区分区。