16進数の乗算方法と10進数への変換について

このQ&Aのポイント
  • Excel2003で16進数どうしの乗算を行いたいですが、データが64bitであるため計算ができません。VBAを使用してコードを書いて計算しましたが、結果は10進数になってしまいました。Windowsの電卓のように切り捨て処理を行いたいので、64bitに結果を揃えたいです。しかし、Excel上では10進数になってしまう理由がわかりません。
  • この質問では、Excel2003で16進数どうしの乗算を行いたいという要望がありますが、データが64bitであるため計算ができません。VBAを使用して計算しましたが、結果は10進数になってしまいました。切り捨て処理を行いたいため、結果を64bitに揃えたいのですが、Excel上ではなぜか10進数になってしまいます。
  • Excel2003で16進数の乗算を行いたいのですが、データが64bitであるため計算ができません。VBAを使用して計算しましたが、結果は10進数になってしまいました。64bitにするための切り捨て処理を行いたいのですが、Excel上ではどうしても10進数になってしまいます。なぜなのでしょうか。
回答を見る
  • ベストアンサー

16進数どうしの乗算

Excel2003で、16進どうしの乗算をしたいです。もちろん関数は知っています(Sheet,VBA共に)。 しかしデータが掛ける数掛けられる数どちらも64bitあるので計算が出来ません。 そこでVBAを使ってコードを書いて計算しました。 でも私はその結果を64bitにしたいので、私の書いたコードでは10進数になってしまい、うまく行きません。 64bitにするというのは、Windowsについている電卓のように切り捨て処理をしたいからです。 頭を使って考えましたが、どうしても結局は10進数になってしまいます。Excelだからでしょうか。 ちなみに、64bitの数のうち、1つは固定された数です。 文章が汚くて解りづらいかも知れませんが、どうかお願いします。 *16進数の乗算をして2進数または16進数で結果を出す方法か、10進数でxxbitに揃える方法でお願いします。(それ以外でもやりたいことが出来れば気にしません。)

質問者が選んだベストアンサー

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.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 お試しください。

cyo_k08
質問者

お礼

イミディエイトで確認した所、17桁以降が切り捨てられ16桁になっていました。電卓の結果と一致です。本当にありがとうございました。 10進数を16進数に変換するのをどうしたら良いかよく解らなかったのですが(どのように実装するか、です。変換方法自体は知っていました。)、このコードから学ぶ事が出来ます。

その他の回答 (1)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

どういう意味で64bitという言葉を使っているんでしょうか? 符号なしの2進数なら64bit=64桁ですが、16進数なら64bit=16桁になります。 16桁の16進数にしたいということなんでしょうか? >64bitにするというのは、Windowsについている電卓のように切り捨て処理をしたいからです。 これはどいう意味? 切り捨て処理とは小数点以下切り捨てのこと? それなら16進とか64bitとかは関係ないと思うんですが。 10進数を16進数にするにはHex関数を使えばできます。 それを16桁にしたいなら、頭に必要な分だけ0を付ければいいでしょう。 ただし、A~Fが入っていない16進数をExcelのセルに表示すると10進数とみなされるので、 セルの表示形式を文字列にするか、先頭に引用符(')を付ける必要があります。

cyo_k08
質問者

お礼

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

cyo_k08
質問者

補足

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

関連するQ&A

  • Verilogでモンゴメリ乗算

    私はVerilogについてはド素人で全くと言っていいほど書くことができません。そこに仕事上でVerilogでモンゴメリ乗算をしなくてはならなくなりました。どうかわかる方はこの以下のアルゴリズムを利用してプログラムを教えてください。お願いします。 まずはそのアルゴリズムを紹介します。 [モンゴメリ乗算アルゴリズム] Input: N,0<A<N,0<B<N,V  前計算: V=-N-1mod2r output: M=A・BmodN Step 1:Q=A・B・VmodR R=2r   Step 2:M=AB+QN Step 3: M=M/R 注.前計算,step1の2rは“2のr乗”です。また前計算の-N-1は   “-Nの-1乗”のことです。 ビット数は全て8bitでお願いします。  

  • 電卓における「乗算器の回路」と「2進法・10進法間の変換」

    電卓のしくみを調べています。 以下のことはわかりました。 A.計算には2進法を利用している(引き算には2の補数を利用している) B.全加算器、乗算器などをAND回路、OR回路などをつかって実現している そこで2点知りたいことがでてきました。 1.乗算器の計算のしくみは、 http://www-lab.ee.uec.ac.jp/text/arithmetic/serial.html をみてなんとなくわかったのですが、AND回路、OR回路などをつかった具体的な回路がいまいちイメージできません。 乗算器の回路を図で表し、詳しく解説したサイトがあれば教えてください。 2.電卓では入力と出力が10進法ですが、具体的な計算は2進法でやっているということはわかりました。しかし、入力した10進法を2進法に直す回路や、計算結果の2進法を10進法として出力する回路がわかりません。 その回路を図で表し、詳しく説明したサイトがあれば教えてください。 もしそういったサイトがない場合は、これらを解説した書籍を紹介していただければありがたいです。 よろしくお願いします。

  • 10進数(+-)→2進数への変換(2)

    先ほど、ご質問させて頂きました者です、詳細にご説明させて頂きます (1)10進数:-16072 → 2進数:1100 0001 0011 1000 補足:2進数の16bit目の「1」は符号ビット「ー」 (2)10進数:+16072 → 2進数:0011 1110 1100 1000 補足:2進数の16bit目の「0」は符号ビット「+」 補足:10進数の値の範囲は    2進数で 符号1bitを含む16bitの値の範囲です と変換できるVB関数をご教示ください 宜しくお願いいたします

  • Excelで「10桁の自然数×10桁の自然数」を計算する方法

    Excelで「10桁の自然数×10桁の自然数」を関数を組み合わせるか、VBAで組むかして、計算する方法をお分かりになる方おられませんでしょうか?(計算結果は文字列として得られることになると思いますが、それでかまいません。) こうすればできる、というアイデアだけでもかまいませんので、よろしくお願いいたします。

  • 2進数の乗算と除算

    先日、桁上がりについて質問させていただいた者です。 加算と減算はなんとか完成したのですが、乗算と除算になって混乱してしまいました。 二進数の乗算、除算はビットシフトと関係がありますが、私の作っているものの場合はどのようなソースコードにすればよいでしょうか? (ちなみに、bの値は2のべき乗に限定しています。) int main(void) { int a,b,i; int x[8],y[8]; puts("二つの符号なし整数を入力してください。(ただしa>bとし、bは2のべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b);  printf("\n"); /*二進数の形に変換*/ for(i=0;i<=7;i++){ x[i]=a%2; a=a/2; y[i]=b%2; b=b/2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for(i=7;i>=0;i--){ printf("%d",x[i]); } puts(""); printf("b="); for(i=7;i>=0;i--){ printf("%d",y[i]); } printf("となります。\n\n");     return(0);  }

  • pythonの乗算の表示結果の差について教えてください

    pythonの乗算の表示結果の差について教えてください。 pythonの対話モードで下記に示す乗算を行いました。 同じ計算をしているにもかかわらず、結果が異なる理由を教えてください。 参考書によると上の計算表示結果は最大精度で表示しているから、下の計算結果表示は人間が見るための精度で表示しておりバグではない。と、書いていました。最大精度で表示(6.2830000000000000なら理解ができます)しているにもかかわらず、計算結果が違うことがなぜバグではないのか理解ができません。 教えてください。 ※上の結果がおかしい理由は2進数の計算の問題だとは思いますが・・・ ------------------------------------------ >>> 3.1415 * 2 6.2830000000000004 >>> print 3.1415 * 2 6.283 ------------------------------------------

  • [関数] 指定の範囲を乗算したものを加算する

    こちらの識者の方々にはいつもお世話になっています。 関数の質問です。 タイトルが分かりづらくて申し訳ありませんが、詳細は下記ご参照ください。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) ・やりたいこと 下図のA1:G6のようなリストがあります。 F列の合計はSUM関数で求めればいいのですが、G列のポイント合計を ・作業行や作業列を作らず ・関数内で範囲で指定 して作りたいのです。(例では4列ですが、実際にはもっとたくさんの列があるため) B3:E3の一つ一つのセルに対してB2:E2のセルを乗算した値を加算するような関数はありますでしょうか? ピボットやVBAなどではなく関数で実現したいです。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • 暗算で簡単に出来る乗算の方法

    TVを見ていましたら、乗算やN乗の掛け算が暗算で 簡単に出来るという、マス・・・とか?というのが出ていました。 内容は不明ですが興味を持ちましたので、暗算で簡単な乗算方法を推測し てみました。 例えば、掛け算を以下のように足し算だけで 考えることが出来ます。 11×12=132  11 12←1+2=3 132 これは、1112と続けて最初と最後の数字のみ残し、真ん中に後の数12を (1+2)として入れるだけの方法です。 11*15=165 11 15←1+5=6 165 いくつかやってみると確かに法則性がありそうなのですが、 このように計算する場合の条件がわかれば教えていただけませんか。 よろしくお願いします。

  • 進数の+chなどがわかりません

    "パイロット変更 1人目 2人目以降は+Chずつしていってください 102014A0 xxxx など、ゲームの改造コードでありますが まず二人目の計算をする場合 関数電卓の16進数計算で 102014A0 + C をすれば出ますよね? 最高が128なんですが +Chを1回1回計算していくのも大変ですし、一度間違ったら取り返しが付きません 何か一気に+chを128回分計算する方法はないでしょうか? よろしくお願いします

  • さまざまな加算器と減算器と乗算器について

    最近、論理回路の実験の授業で加算器・減算器・乗算器に取り組みました。 加算器については、半加算器と全加算器の機能や作り方がわかりますが、 Q1.なぜ二つの半加算器で全加算器が作られるのか、その理由が少し推測をしましたが、やはりはっきりとわかりません。 あと、何bitやら何bitやらの並列全加算器についてもよくわかりません。これは本間にレジュメを読みながらしないと、なかなか回路が作れません。 Q2.bitって何ですか?加算器の個数を示しているのか、それとも出力とか入力とかの個数を示していますか。 それから、減算器も全然原理がわかりません。 Q3.結果が1の補数か2の補数かはどのように決められていますか? 文がちょっと長くて失礼ですが教えていただければ感謝いたします!

専門家に質問してみよう