18

私はこの場所
で見ることができる SNMPBEECodec を見ています 特に私は機能を見ていますencodeLength()
私が興味を持っているスニペット

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

( Drexel SNMP ライブラリから)。

Math.floor()のような単純な整数除算の代わりに が使用される理由を知りたいtemp/256です。単純な整数除算でも同じ結果が得られるようです。それとも技術的な違いはありますか?

4

2 に答える 2

22

質問の技術的な部分に答えるには:

使用math.floor()は不必要です:temp / 256は整数 (Java の整数演算規則による) でありMath.floor()、整数での使用は無意味です。を簡単に使用できますtemp / 256

著者がなぜこれを行ったのかは、彼らの心を読まずに答えることは不可能です。作者は単に Java の除算の振る舞いに戸惑い、「安全にプレイする」ことに決めたのかもしれませんが、それは憶測に過ぎません。

于 2013-01-22T15:11:48.530 に答える
22

残念なことに、著者ももはや彼の心を読むことができません。これを書いてから約 12 年が経過したため、整数除算だけを使用しなかった理由を忘れてしまいました。いくつかの考え: 通常の動作を想定して他の場所で整数除算を使用しているため、Java での整数除算の規則に関する基本的な混乱にはならなかったでしょう。ある時点で引数に非整数データ型を使用していて、変更時に余分な floor() を取り除かなかった可能性があります (可能性は低いですが)。または、おそらく(より可能性が高い)ある時点で、アルゴリズムを開発しているときに、切り捨てではなく切り上げを試みていました.かわった。

残念ながら、本当の理由は時の霧の中で失われています...しかし、floor() は不要であることには同意します。コードをGithubなどに投稿して、人々が改善および進化できるようにする必要があります。\ジョン

于 2013-01-26T16:09:43.823 に答える