为什么在 BER 编解码器中使用 Math.floor() 代替整数除法

2022-09-02 19:41:33

我正在查看SNMPBEECodec,可以在此位置
看到 特别是我正在查看我感兴趣的功能
A片段encodeLength()

        int numBytes = 0;
        int temp = length;
        while (temp > 0)
        {
            ++numBytes;
            temp = (int)Math.floor(temp / 256);
        }   

(来自 Drexel SNMP 库)。

我想知道为什么使用而不是像.似乎简单的整数除法会得到相同的结果。还是存在技术差异?Math.floor()temp/256


答案 1

要回答您问题的技术部分:

使用是多余的:是一个整数(根据Java的整数算术规则),在整数上使用是毫无意义的。您可以简单地使用 .math.floor()temp / 256Math.floor()temp / 256

作者为什么这样做,如果不读懂他们的心思,就不可能回答。作者可能只是对Java中的分裂行为感到困惑,并决定“安全行事” - 但这只是猜测。


答案 2

好吧,不幸的是,作者也无法再读懂他的思想 - 自从我写这篇文章以来已经过去了大约12年,所以我忘记了我不只使用整数除法的原因。一些想法:我在其他地方使用整数除法假设通常的行为,所以它不太可能是Java中整数除法规则的基本混乱;有可能(尽管不太可能)我在某个时候使用非整数数据类型作为参数,并且在我更改时没有摆脱多余的 floor();或者也许(更有可能)我在开发算法时试图向上舍入而不是向下舍入,使用ceil()作为一种廉价的(=更少的字符)方法来做到这一点,并且当我改变时,只是条件反射地切换到floor()。

所以不幸的是,真正的原因迷失在时间的迷雾中......但我同意,floor()是多余的。我真的应该在Github或类似网站上发布代码,这样人们就可以改进和发展它。\ 乔恩


推荐