ExcelのVBAで単精度浮動点小数(以下、小数)を16進数に直すためにコードを書いています。
頭の中では、小数→整数部分と小数点以下に分解→2進数→16進数に変換処理という流れはできています・・・
そこで、10進数を2進数に直すために、2で割らないといけません。そのあたりの処理をどのように書いたら良いか分かりません。
桁数の関係で、DEC2BIN関数は使えないので
以下、今できているコードを貼り付けます。
=====================================================
Dim inte As Integer
Dim nsign As String
Dim float32, pint As Double
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'' 小数を整数部分+小数点以下部分に分解
''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If InStr(float32, ".") = 0 Then
inte = Mid(float32, 1)
Else
inte = Mid(float32, 1, (InStr(float32, ".") - 1))
pint = "0" & Mid(float32, (InStr(float32, ".")))
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'' 小数の正負判定(2進数の時使う)
''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If float32 >= 0 Then ' float32が0以上かどうか
nsign = 0 ' Trueなら 0
Else
nsign = 1 ' Falseなら 1
End If
=====================================================
以上ですが、よろしくお願いします。
No.4ベストアンサー
- 回答日時:
>可能なら2進数も欲しいのですが、16進数から2進数にするか・・・
No3です。
2進数に変換する機能を追記しました。
以下、実行結果です。
00
00
20
C0
00000000
00000000
00100000
11000000
------------------------------------------
Option Explicit
Type F32
d As Single
End Type
Type B4
d(4) As Byte
End Type
Public Sub dump()
Dim data1 As Single
Dim in_data As F32
Dim out_data As B4
Dim i As Long
data1 = -2.5
in_data.d = data1
LSet out_data = in_data
For i = 0 To 3
Debug.Print ByteToHex(out_data.d(i))
Next
For i = 0 To 3
Debug.Print ByteToBit(out_data.d(i))
Next
End Sub
Private Function ByteToHex(ByVal data As Byte) As String
ByteToHex = Hex$(data)
If Len(ByteToHex) < 2 Then
ByteToHex = "0" & ByteToHex
End If
End Function
Private Function ByteToBit(ByVal data As Byte) As String
Dim i As Long
Dim str As String
str = ""
For i = 1 To 8
str = (data Mod 2) & str
data = data \ 2
Next
ByteToBit = str
End Function
No.3
- 回答日時:
IEEE754 で定義される単精度浮動小数点数(32ビット)の内部表現を16進数でそのまま見たいということと解釈しました。
以下のようにしてください。
例では、-2.5の値の単精度浮動小数点数(32ビット)の内部表現を16進数で表示しています。
結果は、イミディエイトウィンドウに
00
00
20
C0
と表示されます。従って、内部表現は、00 00 20 C0 になります。
下記URLにC言語で-2.5の内部表現を求める方法が書いてあります。-2.5の内部表現は C0 20 00 00になります。
https://qiita.com/nia_tn1012/items/d26f0fc993895 …
私が提示した方法では、00 00 20 C0 となっていますが、これはリトルエンディアンの為です。
もし、C0 20 00 00のような結果を望むなら、
i=0 to 3 を i = 3 to 0 に変えてください。
------------------------------------
Option Explicit
Type F32
d As Single
End Type
Type B4
d(4) As Byte
End Type
Public Sub dump()
Dim data1 As Single
Dim in_data As F32
Dim out_data As B4
Dim i As Long
data1 = -2.5
in_data.d = data1
LSet out_data = in_data
For i = 0 To 3
Debug.Print ByteToHex(out_data.d(i))
Next
End Sub
Private Function ByteToHex(ByVal data As Byte) As String
ByteToHex = Hex$(data)
If Len(ByteToHex) < 2 Then
ByteToHex = "0" & ByteToHex
End If
End Function
コード付での返信ありがとうございます。
教えて頂いたコードは確かに1発で16進数にできますね。シート上の値を取得して、シート上に変換結果を返す所まで確認しました。
可能なら2進数も欲しいのですが、16進数から2進数にするか・・・
No.2
- 回答日時:
例えば円周率 x = 2 pi = 6.2831... を例に取ります。
1.sign(x) = 1
2. log2(x) = 2.65 > 2 であるから整数部の桁数3
3. x > 2^2 であるから整数部3桁目は 1
4. pi - 1 * 2^2 > 2^1 であるから整数部2桁目は1
5. pi - 1 * 2^2 - 1 * 2^1 < 2^0 であるから整数部1桁目は 0
これで x の整数部の2進数が、(符号ビットを除いて)110 と決まる。
6. 小数部を y = x - 6 とする。
7. y < 2^(-1) であるから小数部1桁目は 0
8. y - 0 * 2^(-1) > 2^(-2) であるから小数部2桁目は 1
9. y - 0 * 2^(-1) - 1 * 2^(-2) < 2^(-3) であるから小数部3桁目は 0
こんな感じで、2進数を何ビットで表現するか分かりませんが、仕様で決めた桁数まで小数部の計算を繰り返します。
もともと与えられる小数が IEEE754 binary32 に則った数なので、2進数でいうと32bitで表現しないといけないです。
言葉では何となく理解できるんですが、コードではどのように書き表していくといいのかピンと来ず・・・
No.1
- 回答日時:
いきなりコードを書くのではなくて、処理の流れを言葉で書いてみましょう。
元の数を x とするとき
1. x の符号の正負によって、2進数の符号ビットを決定
2. x = 2^p と表現する時の p の値から、2進数としての整数部の桁数が決定
3. 小数部は、桁が許す限り割り算を繰り返す。
ざっくり書いたけれど、これをもっと詳細に文字にしてみましょう。
mabuterolさんの処理の流れとは違いますが・・・
3.以降で止まっている感じです。
元の数をxとする。
1.x を整数部と小数部に分解。
2.x の符号で正負を決定。
3.整数部を商が0になるまで2で割り続ける。
4.3.の余りを逆順で結合。
5.小数部の小数点以下が0になるまで掛け算。
6.5の整数部分を結合。
7.例外処理を入れる(循環小数)
8.2,4,6を結合し、16進数に直す。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
10進数→2進数への変換
Visual Basic(VBA)
-
16進の10進変換について
Visual Basic(VBA)
-
EXCEL16進⇒浮動小数変換したい
Excel(エクセル)
-
-
4
VBAを使って二進法計算
Visual Basic(VBA)
-
5
エクセル DEC2BIN 範囲外数値の演算
その他(Microsoft Office)
-
6
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel VBA】10進数を2進数に...
-
printfの%eで指数部分の桁数を...
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
C言語の構造体にてバブルソート...
-
C#でのswitch文
-
マクロ登録したピボットが重い...
-
ビットデータのチェック方法
-
Cのプログラムがどうしても動き...
-
'dataType' 引数を Null にする...
-
linuxのシェルでファイル名に先...
-
ハッシュの配列???
-
C言語でのLinuxとwindows共通の...
-
int型(2バイト)データの分割
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
ListView重複データ削除
-
Excel VBA メール作成について ...
-
機種依存文字をチェックしたい。
-
DataGridViewの特定列に入力さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
ポインター引数の関数でコンパ...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
CreateProcessでの環境変数の設...
-
RegQueryValueExでの2バイト文字
-
'dataType' 引数を Null にする...
-
【Excel VBA】10進数を2進数に...
-
C++ multipart/form-data f
-
matlabのソースコードをpython...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
-
int型(2バイト)データの分割
-
Excel VBA グラフ作成のとき...
-
C言語 構造体の名前欄?を小文...
-
CSVファイルの行と列のセルって...
-
C++/CLIのオブジェクト型配列
-
C言語 ファイル内のデータと入...
-
C言語についてです! 同じ年の...
おすすめ情報
処理の流れを言葉で書けてもVBAでの表し方が ?? になりやすいので、VBAのコードも書いていただけると助かります。
Do~Loop文でとりあえず整数部分の2進数変換はできました。
あとは、小数点以下の2進数変換です・・・
======================
Dim inte As Integer
Dim ww, ws As String
int2 = Abs(inte)
Do
ww = int2 \ 2
If ww = 0 Then
ws = (int2 Mod 2) & ws
Exit Do
End If
ws = (int2 Mod 2) & ws
int2 = ww
Loop
======================