
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も見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
iアプリ jamファイルの動的な出力
-
RegQueryValueExでの2バイト文字
-
printfの%eで指数部分の桁数を...
-
matlabでのRRI検出
-
00月00日00時00分→0000年00月00...
-
変数に格納したいです。
-
[error] [client ---- ] Argument
-
この花の名前を教えてください。
-
hiddenを使ったセッション
-
任意な項目のソート
-
病院の当番表
-
チェックボックスの値だけが受...
-
C言語 リスト構造
-
Perlで2つのテキストファイルの...
-
matlabのソースコードをpython...
-
stable diffusionのエラー
-
お直しお願いいたします
-
MySQLに登録すると文字化け
-
画像ファイルの読み込みについて
-
ホスト名の取得&表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
int型(2バイト)データの分割
-
CreateProcessでの環境変数の設...
-
【Excel VBA】10進数を2進数に...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
Excel VBA グラフ作成のとき...
-
ポインター引数の関数でコンパ...
-
C言語でのLinuxとwindows共通の...
-
C言語の構造体にてバブルソート...
-
sort関数でひらがなとカタカナ...
-
VisualBasicでレジストリキーの...
-
構造体のソートの方法について...
-
RegQueryValueExでの2バイト文字
-
'dataType' 引数を Null にする...
-
ActivePerlでSMTPプロトコルで...
-
POSTで配列のデータを渡す方法は?
-
min_elementの三番目の引数
-
c言語の多次元配列で1から100ま...
おすすめ情報
処理の流れを言葉で書けても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
======================