No.5ベストアンサー
- 回答日時:
補足どうもです。
(やっぱり私の説明では分かりませんでしたか・・・)ほんと説明が下手ですみません。
私の考え方ですので、もっと簡単な方法があるかもしれません。
一例として考えてください。
()が配列だと思ってください。
16^0 = 1 = 1*(10^0)
16^1 = 16^0*16 = 16*(10^0) = 1*(10^1)+6*(10^0)
16^2 = 16^1*16 = 16*(10^1)+96*(10^0) = 25*(10^1)+6*(10^0)
=2*(10^2)+5*(10^1)+6*(10^0)
というように16のN-1乗に16を掛ける
(各配列に16を掛けて配列内の繰り上がり処理をする)
ようにすれば 16^Nは求まると思います。
これに上と同じ様に16進の各桁を掛けた物を加算していけば
求める10進数になります。
&HABC = &HA * 16^2 + &HB * 16^1 + &HC * 16^0
(16^0を求める → &HC*16^0を計算する →
16^1を求める → &HB*16^1を計算し加算する →
16^2を求める → &HA*16^2を計算し加算する →・・・
のように交互に繰り返すと効率が良いのではと思います)
以下は自作プログラムです。
・プログラムの中身はもっと効率の良い方法があれば書きなおしてください。
・有効桁数は、全ての配列を計算してもいいですが、
必要の無い(まだ使っていない)配列を計算しても
しょうがないので、付けています。
・Debug用の変数とプログラムは、Debugが終了したら
消してください。(十分テストしてください)
(イミディエイトウィンドウに途中経過が表示されます。)
・最初の桁あふれチェックはコメントにしてありますが、
最初にチェックした方が、いいと思います。
(引数の16進の文字列が10進で何桁かは以下の式で
あっていたと思いますが、間違っていたら修正してください。)
hxの桁あふれのチェックを作ってないので追加してください。
・配列を増やせば、64桁以上も可能だと思います。
(どこまで増やせるかは未確認)
関数にしてありますので、
Private Sub Command1_Click()
Text2.Text = ToDecFromHex(Text1.Text)
End Sub
のように使ってください。
Function ToDecFromHex(a As String) As String
Dim hx(77) As Integer '16^?を10進数にした1桁毎の配列
Dim dc(77) As Integer '答えの1桁毎の配列
Dim B As Byte '16進数の桁毎の値(0~15)
Dim cnt As Integer '16^?の有効桁数
Dim cnt2 As Integer '答えの有効桁数
Dim i As Integer
Dim j As Integer
'Debug用
Dim dhx As String
Dim ddc As String
'If (Int(Len(a) * Log(16) / Log(10)) > UBound(dc)) Then
' ToDecFromHex = "桁あふれ1"
' Exit Function
'End If
For i = 0 To Len(a) - 1
If (InStr("0123456789ABCDEFabcdef", Mid(a, Len(a) - i, 1)) = 0) Then
ToDecFromHex = "16進数ではありません"
Exit Function
End If
'16進数のi+1桁目10進変換
B = "&h" & Mid(a, Len(a) - i, 1)
'16^i計算
If (i = 0) Then
hx(0) = 1
cnt = 0
Else '16^j =16^(j-1)*16
For j = 0 To cnt
hx(j) = hx(j) * 16
Next j
End If
j = 0
Do
'繰り上げ処理
If (hx(j) >= 10) Then
If (j = cnt) Then '有効桁数を増加
cnt = cnt + 1
If (cnt > UBound(hx)) Then '有効桁数が配列以上だとエラー
ToDecFromHex = "桁あふれ"
Exit Function
End If
End If
hx(j + 1) = hx(j + 1) + hx(j) \ 10
hx(j) = hx(j) Mod 10
End If
'答えに足しこみ
dc(j) = dc(j) + hx(j) * B
j = j + 1
Loop Until (j > cnt)
cnt2 = cnt
j = 0
Do
'繰り上げ処理
If (dc(j) >= 10) Then
If (j = cnt2) Then '有効桁数を増加
cnt2 = cnt2 + 1
If (cnt2 > UBound(dc)) Then '有効桁数が配列以上だとエラー
ToDecFromHex = "桁あふれ"
Exit Function
End If
End If
dc(j + 1) = dc(j + 1) + dc(j) \ 10
dc(j) = dc(j) Mod 10
End If
j = j + 1
Loop Until (j > cnt2)
'************** Debug ********************
dhx = ""
For j = 0 To cnt
dhx = hx(j) & dhx
Next j
dhx = "16^" & i & ":(" & cnt & ")" & dhx
ddc = ""
For j = 0 To cnt2
ddc = dc(j) & ddc
Next j
ddc = Mid(a, Len(a) - i, i + 1) & ":(" & cnt2 & ")" & ddc
Debug.Print dhx & vbCrLf & " " & ddc
'****************ここまで******************
Next i
For j = cnt2 To 0 Step -1
ToDecFromHex = ToDecFromHex & dc(j)
Next j
End Function
何か問題やプログラムでわからない事がありましたら補足してください。
(ちょっと長くなってしまいました)
taisuke555さん(><)!
ほんとにほんとにありがとうございました!!
ここまで詳しく説明していただけるなんて感激です!
"わかりにくい"なんてとんでもない!
自分自身がまだまだ未熟なだけです!
ほんとにありがとうございました!
すごく助かりましたm(__)m!!
No.4
- 回答日時:
(1)FFFFFFFF・・・・・FFFFF(64桁)
=16^64-1
=115792089237316195423570985008687907
853269984665640564039457584007913129639935
という結果になりました。(78桁)
自作プログラムなので、合ってるかわかりません(確認の方法がないです)
16^64-1=1.15792089237316E+77となるので、合ってるような気はしますが・・・
(2)1.15792089237316E+77の表示ではダメという事ですよね?
私は、
16^?を10進に直した物を1桁づつの配列にする
16進数の1桁づつを16^?で掛け算をし答えの配列に加算する
最終的に配列を結合して文字列で表示させました。
(説明が下手ですみません)
わからなければ、補足してください。
(自作プログラムで良ければ、記載します。)
>わからなければ、補足してください。
>(自作プログラムで良ければ、記載します。)
taisuke555さん!とても分かりやすく、かつ丁寧なご回答誠にありがとうございました!
>1.15792089237316E+77の表示ではダメという事です>よね?
そうです!その通りです!あれこれ考えていたのですが駄目でした(><)計算は到底不可能だと思っていましたので文字列に直して・・というのは何となくわかるのですが・・。
>16^?を10進に直した物を1桁づつの配列にする。
これは"?乗"の"?"の部分を10進数に直すという事でしょうか?(一体どうやって・・?)
>16進数の1桁づつを16^?で掛け算をし答えの配列>に加算する
例えば"B6D"という16進数があった場合はどう考えればよいのでしょうか?質問に質問を重ねて本当にごめんなさい!もしお時間があればまたご教授下さい。
No.3
- 回答日時:
すみません。
1)の桁数間違えました(^^;2^256-1ですね。。。(既にお答えがありますが)
don_chaさん、早急なご回答誠にありがとうございます!!に・・二番なんですが、もうちょっと具体的にいうと、どういうふうに計算すればいいのでしょうか(^^;)?
No.2
- 回答日時:
1)16進数の64桁
F=4bit 4bitX64桁=256bit
ですから2進数で256bitのデータですね。
マイナスを考えなければ、0~2^256-1まで表せます。
(Windowsの電卓で関数モードにして計算しましょう)
2)多数桁の整数演算は、1桁ずつ行って文字列に変更する手が有るかと思います。
S_Fujiさん、早速のご回答誠にありがとうございました!2番なんですが、自分も考えたんですが、例えば16進数のFFは10進数で255・・を文字列の結合で表記するにはどうすればいいのでしょうか?質問が重なって申し訳ございません!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- 物理学 2物体の単振動 1 2023/08/17 20:27
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) Excel VBA 教えてください。 VBA初心者です。 詳しい方がいましたら教えてください。 下記 3 2023/04/25 11:22
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Excel(エクセル) 列を自動で追加したい 3 2022/07/11 12:58
- Ruby 英数字を含む文字列(0-9,A-Z)の桁数圧縮をするには 5 2022/06/28 18:15
- その他(コンピューター・テクノロジー) 50台の織機から回転数を取得・集計しモニターに表示したい 2 2022/11/05 15:48
- アニメ アニメ製作が形成してきたパターンや方式と今後について 2 2023/08/11 03:49
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAで質問です。離れた二...
-
C言語 配列の長さの上限
-
パイソンの
-
C言語で特定列だけを抽出して配...
-
アルファベットの配列を数字の...
-
C言語の配列のサイズ
-
配列を使わずに、変数名を動的...
-
Excel、VBAのユーザーフォーム...
-
本日までの累計を表示させたい!
-
メモリの初期値
-
【C言語】配列の中に配列を入れ...
-
構造体配列を引数とするDLL作成...
-
if文で「配列a[i]が小数ならば...
-
unsigned char の配列で途中で0...
-
配列の参照渡しで型が一致しま...
-
配列内の文字間を排他的論理和...
-
c言語乱数について
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
構造体配列のポインタを引数に
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報