標記の件で質問です。
(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倍速いようです。
外部仕様はどちらも同じですが、教材の模範解答として、どちらが優れているでしょうか?(コメントや変数名は大いに検討の余地がありそうですが)
No.3ベストアンサー
- 回答日時:
(1)は、
10^7x1 + 10^6x0 + 10^5x1 +...+ 10~0x0
というように
2の重みを掛けて足していくという
基数変換の計算方法をそのままコード化したような形になりますね。
そういう計算方法に慣れている人には(1)のほうがわかりやすいかもしれません。
参考:「基数変換」で検索してヒットしたものです
参考URL:http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text …
度々ありがとうございます。
私見では、
(1) 要求仕様通りに動作する。
(2) 妥当な性能 (リソース消費、スループット両面で) である。
(3) 可読性が悪くない。(極端に冗長 Or 複雑 Or トリッキーなのはNG)
の3条件をすべて満たせば、教本と異なるコーディングでも排除する理由はないと思います。
しかし、上位の桁から処理するのが一般的、とのことですので、教本に掲載する「解答例」としては、こちらを採ることにします。
ありがとうございました。
No.4
- 回答日時:
NO3は間違いでした。
あれでは10の重みでした。
2の重みはこうですね。
2^7x1 + 2^6x0 + 2^5x1 +...+ 2^0x0
申し訳ありません。
この回答への補足
Resが遅くなり、誠に申し訳ございません。
その後、職場の同僚にも尋ねてみたのですが、やはり上位の桁から計算していくのが一般的だとのことでした。
私としてはちょっと意外でしたが・・・。
No.1
- 回答日時:
解り易いのは(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
# マイナスの考慮は不要ですか?
コメントありがとうございます。
先入観、前提条件等一切無しに自分で思い付いたままに書いたのが(2)なので、動きはともかくとして、一般的な感覚とずれていないか確認したくご意見を募った次第です。
やはり、下位の桁から計算するのが一般的なのですね。
> こんなのもありですね。
文字列処理は、算術演算より速度が遅いはずですが・・・?
> # マイナスの考慮は不要ですか?
最上位の符号ビットだけの問題ですし、実用目的のプログラムではありませんので、そこまでは要らないのではないかと思っています。
# 実際に使うとすれば、IPアドレスの2進表示ぐらい (ネットワーク関連資格試験対策?(^-^;) だと思いますが、IPアドレスなら負数を扱うことはありませんので。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進数 加算 減算 C言語
-
C言語プログラミングにて、arct...
-
VB6.0での小数点の扱いについて
-
O(n log n)について2
-
VB6のFIX関数での誤差について
-
ExcelでPC(パソコン)によって...
-
C言語でセルオートマトンを作成...
-
時刻の比較
-
パソコンで階乗を計算
-
”/”を使わずに割り算したいんで...
-
floatの有効桁数
-
c languageで 簡単な質問があ...
-
2進数の0.2?
-
浮動小数点演算を固定小数点演...
-
VBAのINT関数について
-
ラズベリーパイ>MM-TXS03で温度...
-
EXCELの関数"STDEV(標準偏差)"...
-
Double型について
-
浮動小数演算は実行環境の変化...
-
VBAでの割り算の余りの求め方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
ExcelでPC(パソコン)によって...
-
ExcelのINT関数の計算結果がお...
-
16進数 加算 減算 C言語
-
VB.net Double と...
-
floatの有効桁数
-
三菱シーケンサ(Aシリーズ)で...
-
c languageで 簡単な質問があ...
-
除算を使わずに10で割りたい。
-
VBAでミリ秒まで出力する方法
-
VBAでの割り算の余りの求め方
-
VB6.0での小数点の扱いについて
-
VB6のFIX関数での誤差について
-
有効数字について 以前質問をし...
-
100桁の計算ができなくて困って...
-
浮動小数演算は実行環境の変化...
-
EXCELの関数"STDEV(標準偏差)"...
-
BCD・HEX・BINについて
-
コンピューターは指数関数をど...
-
乱数 なぜ剰余を使うのか
おすすめ情報