プロが教えるわが家の防犯対策術!

標記の件で質問です。

(1)
教本に掲載されていた解答例は下記です。(出典不明。自社製?)

Public Function CnvDecimal1(ByVal n As Long)
  Dim b As Long
  Dim d As Long
  Dim i As Long

  For i = 7 To 0 Step -1
    b = Fix(n / 10 ^ i)
    d = d + 2 ^ i * b
    n = n - 10 ^ i * b
  Next i

  CnvDecimal1 = d
End Function

(2)
解答例を見ずに自分で考えて書いたコードは下記です。

Public Function CnvDecimal2(ByVal lngSrc As Long)
  Dim i   As Long
  Dim lngDec As Long

  Do Until lngSrc = 0
    lngDec = lngDec + (2 ^ i) * (lngSrc Mod 10)
    i = i + 1
    lngSrc = Fix(lngSrc / 10)
  Loop
  CnvDecimal2 = lngDec
End Function

(2)を書いた理由は、
・教本の加筆、修正に際し、自分の理解を確認しつつ、よりよい内容に改定したい。
・(1)のコードを初心者にわかりやすく説明できる自信がない。
・桁数が固定なのが気に入らない。(汎用性がない)

スループットを測定(10万回の処理に掛かる時間を測定)したところ、(2)のほうが約2.7倍速いようです。
外部仕様はどちらも同じですが、教材の模範解答として、どちらが優れているでしょうか?(コメントや変数名は大いに検討の余地がありそうですが)

A 回答 (4件)

(1)は、


10^7x1 + 10^6x0 + 10^5x1 +...+ 10~0x0
というように
2の重みを掛けて足していくという
基数変換の計算方法をそのままコード化したような形になりますね。
そういう計算方法に慣れている人には(1)のほうがわかりやすいかもしれません。

参考:「基数変換」で検索してヒットしたものです

参考URL:http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text …
    • good
    • 0
この回答へのお礼

度々ありがとうございます。

私見では、

(1) 要求仕様通りに動作する。
(2) 妥当な性能 (リソース消費、スループット両面で) である。
(3) 可読性が悪くない。(極端に冗長 Or 複雑 Or トリッキーなのはNG)

の3条件をすべて満たせば、教本と異なるコーディングでも排除する理由はないと思います。

しかし、上位の桁から処理するのが一般的、とのことですので、教本に掲載する「解答例」としては、こちらを採ることにします。

ありがとうございました。

お礼日時:2005/06/11 16:40

NO3は間違いでした。


あれでは10の重みでした。
2の重みはこうですね。
2^7x1 + 2^6x0 + 2^5x1 +...+ 2^0x0

申し訳ありません。

この回答への補足

Resが遅くなり、誠に申し訳ございません。

その後、職場の同僚にも尋ねてみたのですが、やはり上位の桁から計算していくのが一般的だとのことでした。

私としてはちょっと意外でしたが・・・。

補足日時:2005/06/11 16:30
    • good
    • 0

私見ですが、以下の通りです。


対象が初心者という事ならば、プログラミング言語習得が優先で(1)が一般的で良いと思います。

この回答への補足

ありがとうございます。

No.1の方のコメントと正反対のご見解ですが、できれば具体的な根拠をご提示頂けないでしょうか?

(現在、手元に基数変換を題材とする解説資料がないため、判断が付きかねます)

補足日時:2005/06/03 22:00
    • good
    • 0

解り易いのは(2)だと思います。


(1)が上の桁から、(2)が下の桁からの違いですね。
下の桁から計算していくのが普通だと思うので、(2)です。

こんなのもありですね。
dim sSrc as string
sSrc = cstr(lngSrc)
for i=1& to len(sSrc)
lngDec = lngDec + mid$(sSrc,i,1&)*2^(len(sSrc)-i)
next

# マイナスの考慮は不要ですか?
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

先入観、前提条件等一切無しに自分で思い付いたままに書いたのが(2)なので、動きはともかくとして、一般的な感覚とずれていないか確認したくご意見を募った次第です。
やはり、下位の桁から計算するのが一般的なのですね。

> こんなのもありですね。
文字列処理は、算術演算より速度が遅いはずですが・・・?

> # マイナスの考慮は不要ですか?
最上位の符号ビットだけの問題ですし、実用目的のプログラムではありませんので、そこまでは要らないのではないかと思っています。

# 実際に使うとすれば、IPアドレスの2進表示ぐらい (ネットワーク関連資格試験対策?(^-^;) だと思いますが、IPアドレスなら負数を扱うことはありませんので。

ありがとうございました。

お礼日時:2005/06/03 21:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!