
VBで4byteの数字の上位2バイト、下位2バイトをとりだす方法を教えてください。
以下のコードの8行目で(9行目も同様)オーバーフローしてしまいます。
1 Dim inputData As Double
2
3 Dim d1 As Double
4 Dim d2 As Double
5
6 inputData = 65538 'd1=1, d2=2を期待
7 d1 = inputData And 65535 'FFFFでマスク
8' d2 = inputData And 4294901760# 'FFFF0000でマスク
9 d2 = CDbl(inputData And 4294901760#) 'FFFF0000でマスク
No.4ベストアンサー
- 回答日時:
ようは、32bit符号なし数値を、上位16bitと下位16bitに切り出して符号なしの数値で求めたいということですよね。
Dim inputData As Long
Dim d1 As Long
Dim d2 As Long
inputData = &HFFFFFFF0 '上位と下位がわからなくなるとまずいので変えてあります。
d1 = inputData And &HFFFF&
Dim str As String
str = "00000000" & Hex(inputData And &HFFFF0000)
d2 = "&H" & Left(str, Len(str) - 4)
MsgBox d1 & " " & d2
あとはマスクではなくこんな方法も。
Type typeL
l As Long
End Type
Type typeI
iL As Integer
iH As Integer
End Type
Sub Main()
Dim l As typeL
Dim i As typeI
Dim d1 As Long
Dim d2 As Long
l.l = &HFFFFFFF0
LSet i = l
d1 = "&H" & Hex(i.iL)
d2 = "&H" & Hex(i.iH)
MsgBox d1 & " " & d2
End Sub
No.3
- 回答日時:
こんな感じでどうでしょう?
Dim inpData As Long
Dim d1 As Long
Dim d2 As Long
Dim dh
'inpData = &HFFFFFFFF
inpData = 65538
dh = Right("00000000" & Hex(inpData), 8)
d1 = Val("&H" & Left(dh, 4))
d2 = Val("&H" & Right(dh, 4))
If d1 < 0 Then d1 = d1 + 65536
If d2 < 0 Then d2 = d2 + 65536
'Debug.Print d1
'Debug.Print d2
String型を介するんですねぇ!
"00000000"をつけるのもポイントですね。
目から鱗です。勉強になりました。
ありがとうございました。
No.2
- 回答日時:
>説明不足でしたが、4byteというのは、符号なし4byteのことなのです。
符号はあってもなくてもビット操作をするのなら関係ないです。Double等のサイズが違うものを使用するほうがよっぽど問題です。
>inputDataに&FFFFFFFFを代入した時点でオーバーフローしてしまいます。
16進数にすればオーバーフローしません。
で、&FFFFFFFFではなく&HFFFFFFFFです。
#VB6で確認してます。
で、やりたいことってなんですか?
>d1=65535
>d2=65535
>を取得したいのです。
下位16bitを符号なし整数で取得したいのでしょうか?そうすると、今度はd1とd2の違いがわからないのですが。
この回答への補足
>16進数にすればオーバーフローしません。
そうだったんですね。下手に10進に直して代入したのが間違いの基でした。
>#VB6で確認してます。
お時間割いていただき感謝してます
>>d1=65535
>>d2=65535
>>を取得したいのです。
>
>下位16bitを符号なし整数で取得したいのでしょうか?そうすると、今度はd1とd2の違いがわからないのですが。
補足は、MAX(&HFFFFFFFF)を例にあげてしまったので、d1とd2が同じ値になりますが、
&H00010002の場合に、
d1=2(下位2バイト)
d2=1(上位2バイト)
となることを期待しています。
>で、d2って、2じゃなくて&H00010000ですよね?
ではありません。&H0001です。
&HFFFFFFFFの場合には、d2に-65536ではなく
d1=65535(下位2バイト)
d2=65535(上位2バイト)
となることを期待しています。
No.1
- 回答日時:
>6 inputData = 65538 'd1=1, d2=2を期待
おかしくありません?Doubleなんですよね。
浮動小数ですよ。こんなマスクのかけ方はだめですよね。
型はLongで、マスクは16進数で書きましょう。
また、&HFFFFだとInteger(16bit)になってしまうので、
&HFFFF&としてLong(32bit)にしましょう。
Dim inputData As Long
Dim d1 As Long
Dim d2 As Long
d1 = inputData And &HFFFF&
d2 = inputData And &HFFFF0000
で、d2って、2じゃなくて&H00010000ですよね?
この回答への補足
ご指摘ありがとうございました。
説明不足でしたが、4byteというのは、符号なし4byteのことなのです。
最大、0xFFFFFFFFを10進で4294967295とみなして、
d1=65535
d2=65535
を取得したいのです。
なので、教えていただいた方法では
inputDataに&FFFFFFFFを代入した時点でオーバーフローしてしまいます。
VBにはunsignedの型がないため、Doubleを使おうと考えました。
>で、d2って、2じゃなくて&H00010000ですよね?
ご指摘どおり、d1とd2が逆でした。
求めたいのは上位2byteと下位2byteなので、最後にシフトしないとだめですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Visual Basic(VBA) QRコード作成マクロについて 3 2022/11/26 16:55
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- Visual Basic(VBA) エクセル VBA 条件付き書式 簡略化したい 2 2022/06/02 17:46
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- Visual Basic(VBA) vbaで色付けされたセルを除外したいのですが 5 2023/01/28 17:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アセンブリ言語のcasl2について...
-
グラデーションマスクのかけ方...
-
Simulinkのサブシステムの完全...
-
ムービークリップボタンの連動?
-
スクロール処理(早急にお伺い...
-
jakartaというネーミングは一体...
-
パーセントで配置したフラッシ...
-
Flash着せ替え用アクションスク...
-
始めたばかりのVCで
-
Flashで恋愛ゲームを作りたいの...
-
VBAでホームページからコピーし...
-
flash 計算機について
-
FlashでXMLを読み込んだ際の関...
-
フラッシュ中に表示されるスク...
-
Flashマウスオーバー
-
unityの教科書を読んでいて出て...
-
フレームアクションで色の変更...
-
クリップボードの中身のペースト
-
文字列の置き換え処理について
-
ラベルでの移動でテキストの受...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語でネットワーク範囲のIPア...
-
グラデーションマスクのかけ方...
-
マスクをとるとオーバーフロー...
-
Visual Studio Expressのマスク
-
FLASHで使用するマスクやイラス...
-
OpenGLのグラデーションについて
-
DirectXでのicoファイル読み込み
-
OpenGLで背景をグラデーション...
-
Simulinkのサブシステムの完全...
-
グラデーションマスクにトゥイ...
-
マスクをかけた外部テキストの表示
-
構造体のマスクというメンバ
-
ピクセルシフトさせる方法
-
photoshopで書いた四角の枠の中...
-
テキストボックスの中身をリセ...
-
VBAで改行の入ったデータの正規...
-
全てのテキストボックスをセル...
-
VBAユーザーホームテキストボッ...
-
変数に256文字以上のテキストを...
-
マウス自体の移動量の取得
おすすめ情報