web-dev-qa-db-ja.com

BERコーデックで整数除算の代わりにMath.floor()が使用される理由

私はこれで見ることができるSNMPBEECodecを見ています location
特に私は関数encodeLength()を見ています
興味のあるスニペット

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

Drexel SNMPライブラリ から)。

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

17
iamme

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

math.floor()の使用は不必要です:_temp / 256_は整数であり(Javaの整数演算規則による)、整数でMath.floor()を使用しても意味がありません。単純に_temp / 256_を使用できます。

著者がこれをした理由は、彼らの心を読まない限り答えることは不可能です。著者は、Javaの除算の動作について単に混乱し、「安全にプレイする」ことを決定しただけかもしれませんが、それは単なる推測にすぎません。

21
sleske

まあ、残念なことに、作者はもう彼の心を読むことができません。私がこれを書いてから約12年が経過しているため、整数除算を使用しなかった理由を忘れています。いくつかの考え:私は通常の動作を前提として整数除算を別の場所で使用しているため、Javaでの整数除算のルールに関する基本的な混乱ではないでしょう。 (可能性は低いですが)ある時点で引数に非整数データ型を使用していて、変更時に余分なfloor()を削除しなかった可能性があります。またはおそらく(より可能性が高い)アルゴリズムの開発中に、ある時点でceil()を安価な(=文字数を少なくする)方法として使用して切り捨てようとしました。かわった。

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

21
jsevy