2013-01-22 9 views
12

私は機能encodeLength()
私は興味のスニペットを見ています特にこのlocation
で見ることができるSNMPBEECodec見ていBERの代わりに整数除算を用いMath.floor()でありますなぜコーデック

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

Drexel SNMP libraryから)。

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

+4

@EJP:いいえ、一般的に、そのようなコードの技術的な理由がある可能性があります。この理由を理解することは非常に面白いことがあります。しかし、これはそうではありません。しかし、あなたはあなたが自分自身を知らないかどうかを尋ねることによってのみ見つけることができます。 – sleske

+3

これらは厳密には同等ではありません:http://stackoverflow.com/questions/10457208/java-how-do-i-perform-integer-division-that-rounds-towards-infinity-rather-thaしかし、temp> 0あなたの例ではそれは同等です。 – assylias

+0

私がこれを尋ねた理由は、DrexelライブラリがSNMPにとって非常に普及しているからです。私は、欠けているものがあるかどうかを知りたがっていました。 – jogabonito

答えて

17

math.floor()を使用して

は余計です:temp/256は(整数演算のためのJavaの規則によって)整数、整数にMath.floor()を使用することは無意味です。あなたは単にtemp/256を使うことができます。

著者がなぜこのようにしたのかは、読んでも分かりません。作者は、単にJavaの分割の振る舞いについて混乱し、「安全に遊ぶ」ことに決めたかもしれませんが、それはちょうど推測です。

17

残念ながら、著者は私がこれを書いてから約12年経ちましたが、私は整数除算を使用しただけではない理由を忘れてしまいます。いくつかの考え:私は通常の振る舞いを想定して整数除算を使用しているので、Javaの整数除算の規則に基本的な混乱はないでしょう。それは引数に非整数データ型を使用していて、変更したときに余分な床()を取り除かなかった可能性はありますが、ありそうもありません。アルゴリズムを開発している間、私はある時点で丸めようとしていましたが、ceil()を安価な(=文字数の少ない)方法として使用していました。かわった。

残念ながら、本当の理由は時間の霧の中で失われます...しかし私は同意します、床()は余分です。私は実際にGithubなどにコードを投稿して、人々がそれを改善し、進化させるべきです。 \ Jon

関連する問題