アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excel2003で、16進どうしの乗算をしたいです。もちろん関数は知っています(Sheet,VBA共に)。
しかしデータが掛ける数掛けられる数どちらも64bitあるので計算が出来ません。
そこでVBAを使ってコードを書いて計算しました。
でも私はその結果を64bitにしたいので、私の書いたコードでは10進数になってしまい、うまく行きません。
64bitにするというのは、Windowsについている電卓のように切り捨て処理をしたいからです。
頭を使って考えましたが、どうしても結局は10進数になってしまいます。Excelだからでしょうか。

ちなみに、64bitの数のうち、1つは固定された数です。

文章が汚くて解りづらいかも知れませんが、どうかお願いします。

*16進数の乗算をして2進数または16進数で結果を出す方法か、10進数でxxbitに揃える方法でお願いします。(それ以外でもやりたいことが出来れば気にしません。)

A 回答 (2件)

cyo_k08さん


はじめまして。

> でも私はその結果を64bitにしたいので…
> 私の書いたコードでは10進数になってしまい…
正直、何をしたいのかが分からないですが、勝手に回答させていただきます。

64ビットでも、浮動小数点、固定小数点、整数もあり、また整数でもサインあり、
サインなしがあります。
多分、整数で64ビットの計算をしたいとのことだと思いますがEXCEL(VBA)での問題点や
可能性を整理する必要があります。

【64ビットの整数の範囲】
 サイン(+-)あり -9223372036854775808~+9223372036854775807
 サイン(+-)なし 0 ~ 18446744073709551615

【数値で計算できるデータ型の選択】
 整数型 (Integer) 2 バイト
 長整数型 (Long)  4 バイト
 単精度浮動小数点数型 (Single) 4 バイト
 倍精度浮動小数点数型 (Double) 8 バイト
 通貨型 (Currency) 8 バイト
 10 進型 (Decimal) 14 バイト
※64ビット=8バイトなので、8バイト以上が必要です、浮動小数点、固定小数点(通貨型)
 ではだめなので、結果【10 進型】が64ビット計算に使えると思われます。
※Decimalのデータ型を宣言できませんのでVariant型にし、計算する時Decimalの型変換する
 必要があります。

【16進数の表現】
 VBAには16進数数値を記述することは可能です。
 &HFFFFFFFF
 問題は長整数(Longの32ビット)しか指定できないので64ビットなら自分で16進数変換が必要になります。

以上を踏まえて下記の通りプログラムを作成しました。

Sub テストメイン()
 Debug.Print HEXtoDEC("7FFFFFFFFFFFFFFF")
 Debug.Print HEXtoDEC("8000000000000000")
 Debug.Print HEXtoDEC("FFFFFFFFFFFFFFFF")
 
 Debug.Print DECtoHEX(CDec("-1") * CDec(164))
 Debug.Print DECtoHEX(HEXtoDEC("FFFFFFFFFFFFFFFF") * HEXtoDEC("A4"))
End Sub

Function HEXtoDEC(HEX As String) As Variant
 Dim I   As Long
 Dim DEC  As Variant
 If Len(HEX) < 16 Or Val("&H" & Left(HEX, 1)) < 8 Then
  For I = 1 To Len(HEX)
   DEC = DEC * CDec(16) + CDec(Val("&H" & Mid(HEX, I, 1)))
  Next I
  HEXtoDEC = DEC
 Else
  For I = 1 To Len(HEX)
   DEC = DEC * CDec(16) + (CDec(15) - CDec(Val("&H" & Mid(HEX, I, 1))))
  Next I
  HEXtoDEC = -DEC - 1
 End If
End Function

Function DECtoHEX(ByVal DEC As Variant) As String
 Dim I   As Long
 Dim sHEX As String
 If DEC >= 0 Then
  For I = 1 To 16
   sHEX = HEX$(DEC - Int(DEC / CDec(16)) * CDec(16)) & sHEX
   DEC = Int(DEC / CDec(16))
   If DEC = 0 Then Exit For
  Next I
  DECtoHEX = sHEX
 Else
  DEC = Abs(DEC + CDec(1))
  For I = 1 To 16
   sHEX = HEX$(CDec(15) - (DEC - Int(DEC / CDec(16)) * CDec(16))) & sHEX
   DEC = Int(DEC / CDec(16))
  Next I
  DECtoHEX = sHEX
 End If
End Function

お試しください。
    • good
    • 0
この回答へのお礼

イミディエイトで確認した所、17桁以降が切り捨てられ16桁になっていました。電卓の結果と一致です。本当にありがとうございました。

10進数を16進数に変換するのをどうしたら良いかよく解らなかったのですが(どのように実装するか、です。変換方法自体は知っていました。)、このコードから学ぶ事が出来ます。

お礼日時:2011/08/24 21:01

どういう意味で64bitという言葉を使っているんでしょうか?



符号なしの2進数なら64bit=64桁ですが、16進数なら64bit=16桁になります。
16桁の16進数にしたいということなんでしょうか?


>64bitにするというのは、Windowsについている電卓のように切り捨て処理をしたいからです。

これはどいう意味?
切り捨て処理とは小数点以下切り捨てのこと?
それなら16進とか64bitとかは関係ないと思うんですが。


10進数を16進数にするにはHex関数を使えばできます。
それを16桁にしたいなら、頭に必要な分だけ0を付ければいいでしょう。
ただし、A~Fが入っていない16進数をExcelのセルに表示すると10進数とみなされるので、
セルの表示形式を文字列にするか、先頭に引用符(')を付ける必要があります。

この回答への補足

済みません。かなり説明が欠けていました。calc.exeは、16進モードだと16桁まで表示されます。
例えば0xFFFF FFFF FFFF FFFFと入力して、1以上の数を加算すると17桁目以降を切り捨てて(小数点の意ではありません)16桁まで表示します。それの処理をしたいと思っています。(0xFFFFFFFFFFFFFFFF+1=10000000000000000で、表示できない桁を取って0になります)

ちなみに乗算で小数は絶対に出ることが無いです。(2つの数がどちらも非負整数)
説明不足本当に済みませんでした。

補足日時:2011/08/24 20:09
    • good
    • 0
この回答へのお礼

(補足は余り意味が無いみたいで、無駄な事をしてしまいました。(回答の編集機能は無いのですね))

ありがとうございました。

お礼日時:2011/08/24 20:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!