• ベストアンサー

16進数から10進数の計算

代数で16進数の勉強をしているのですが、分からないためどなたか教えて頂けないでしょうか? 問題)16進数演算の結果のうち、他と異なる物が1つある。それはどれか。10進数の10から15は16進数形式ではA~Fで表記するものとする。 (1)2AFDE-1BCDF (2)ABCD+5432 (3)1FEDC-FEDD (1)については、回答がありますが理解出来ません。 2AFDE=2×16^4+10×16^3+15×16^2+13×16+14 -1BCDF=1×16^4+11×16^3+12×16^2+13×16+15     15×16^3+2×16^2+15×16+15=F2FF なぜこの回答になるかも教えて下さい。宜しくお願い致します。

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

  • ベストアンサー
回答No.7

単純に10進数の筆算と同様に考えてはいかがでしょう。 違いは、10で繰り上がるか16で繰り上がるかだけ。 混乱しないため、まずA~Fを10進数でメモること。 (1)A=10、B=11、C=12、D=13、E=14、F=15 (2) 2AFDE  -1BCDF (3)上記に(1)をあてはめると以下の表現になる。   2 10 15 13 14  -1 11 12 13 15 (4)上記を下1桁から順に計算するのですが、  14-15=-1ではNG。下2桁13から1(=16)を  持ってきて(16+14)-15=15(=F) (5)下二桁目:(4)で13-1しているので、12に繰り下がっている。  12-13⇒下3桁目から1(=16)を持ってきて  (16+12)-13=15(=F) (6)上記を繰り返すと、F2FFとなります。 ■10進数の筆算時に繰り下がり(上がり)の数値を斜め上に  小さく記入して計算した経験があると思います。  その方法と同様です。                   

dsx32498
質問者

お礼

10進数に直さなかったので混乱していました。 右から計算すれば良いのですね、非常に分かりやすかったです。 ありがとうございました。

その他の回答 (6)

  • y_akkie
  • ベストアンサー率31% (53/169)
回答No.6

>2AFDE=2×16^4+10×16^3+15×16^2+13×16+14 >1BCDF=1×16^4+11×16^3+12×16^2+13×16+15   まず、2AFDE-1BCDFの計算についてですが、 (2-1)×16^4 + (10-11)×16^3 + (15-12)×16^2 + (14-15) =1×16^4 + (-1)×16^3 + 3×16^2 + (-1) といった形で計算できますね…。 そして、 1×16^4 + (-1)×16^3 + 3×16^2 + (-1) と(1)×16^4 + (-1)×16^3 + (3)×16^2 + (0)×16 + (-1) 書き改めます。 ここから、()のマイナスになっている部分を何とか0~15の数値の範囲に 収まるようにそれぞれを変形していくわけですが、これは筆算と同じよう要領で変形していくわけですが、必ず右から左に向かって順番にやっていくにしないといけません。これは筆算の最下位の桁から最上位の桁へと計算していきますよね。それと同じ要領になります。 つまり、  △がマイナスの場合は、以下のようにして△の部分を0~15までの範囲 のプラスの値にしてやる事ができます。 ○*16^n + △*16^n-1 = (○-1)*16^n + (△+16)*16^n-1 証明:-15<=△<=-1なので、1<=△+16<=15になります。 また、○*16^n + △*16^n-1 = (○-1)*16^n + (△+16)*16^n-1 に関しては、 右辺を実際に計算してやると ○*16^n - 16^n + △*16^n-1 + 16^n =○*16^n+△*16^n-1 と結局は左辺の式に一致します。 そして、これを踏まえ、実際に式を変形していくと、 (1)×16^4 + (-1)×16^3 + (3)×16^2 + {(0)×16 + (-1)} (1) {}の部分の式の(0)×16 + (-1)を(0-1)×16 + (-1 + 16) すなわち、(-1)×16 + (15)に置き換えます。そうすると、 (1)×16^4 + (-1)×16^3 + (3)×16^2 + (-1)×16 + (15)  (2) になります。これで最下位桁の数が15すなわちFであると決定 されました。 次に、 (1)×16^4 + (-1)×16^3 + {(3)×16^2 + (-1)×16} + (15)  の{}の部分に対しても、(3-1)×16^2 + (-1 +16)×16すなわち、 2×16^2 + 15×16に置き換えてやればよいだけです。 すると以下の(3)式が得られますね…。 (1)×16^4 + (-1)×16^3 + (2)×16^2 + (15)×16 + (15)  (3) これで最下位の次の上位桁の値も15すなわちFになりますね。 そして、よく見ればその次の上位桁も0~15の範囲内に収まって いるので、2であると決定されました。 もうお分かりだと思いますが、最後に、(-1)の部分だけを同じような 要領でプラスにしてあげればよいわけですよね。すると、 (1)×16^4 + (-1)×16^3 = (1-1)×16^4 + (-1+16)×16^3=15×16^3 となりますので、最上位桁の値はFであると決定され、 結局は、15×16^3+2×16^2+15×16+15=F2FFになりましたね…。 以上のやり方について理解していれば16進の筆算も以下のように軽々と できるはずです。10進数の筆算も所詮、以上のような原理を利用してできたアルゴリズムなんでしょうね…。   2AFDE -) 1BCDF --------- 2 (10) (15) (13) (14) -) 1 (11) (12) (13) (15) ------------------------------------- (5)  (4)   (3)   (2)   (1) (1)=(14+16)-15= 30-15=15   (2)=(13-1)-13 = 12-13     ->(12+16)-13 = 15 ->F (3)=(15-1)-12 = 14-12 = 2 ->2 (4)=(10+16)-11 = 26-11 = 15 ->F (5)=(1-1)=0 といった形で出来ると思います。

dsx32498
質問者

お礼

詳細にありがとうございました。 ここまで書いていただけて大変助かります。 分かりやすい回答でありがとうございました。

  • sacra_sak
  • ベストアンサー率46% (24/52)
回答No.5

 2AFDE-1BCDF = (2×16^4+10×16^3+15×16^2+13×16+14)-(1×16^4+11×16^3+12×16^2+13×16+15) = 1×16^4+(-1)×16^3+3×16^2+0×16+(-1)    (ここで 1×16^4 = 16×16^3,16^2 = 16×16 = 15×16+16 だから) = 16×16^3-1×16^3+2×16^2+16^2+0-1 = 15×16^3+2×16^2+(15×16+16)-1 = 15×16^3+2×16^2+15×16+15  よってこれは 0x F2FF となります.

dsx32498
質問者

お礼

16^4とか乗数があったので、混乱しましたが 良く分かりました!ありがとうございました。

回答No.4

2AFDE=(2×16^4)+(10×16^3)+(15×16^2)+(13×16^1)+(14×16^0) -1BCDF=(1×16^4)+(11×16^3)+(12×16^2)+(13×16^1)+(15×16^0) F2FF=(0×16^4)+(15×16^3)+(2×16^2)+(15×16^1)+(15×16^0) (16^4)(16^3)(16^2)(16^1)(16^0) 2AFDE= 2 10 15 13 14 -1BCDF= -1 11 12 13 15 0F2FF= 0 15 2 15 15 これを見れば一目瞭然!(であればいいですが) ちなみに、桁をひとつ下げる際には、 (1×16^1)= (16×16^0) (2×16^1)= (1×16^1+16×16^0) (1×16^2)= (16×16^1) というように繰り下げます。

dsx32498
質問者

お礼

隣の行から借りる事が分からなかったです。 これで計算出来ました。ありがとうございます。

回答No.3

>質問の計算式で、なぜ15×16^3・・・になるかが 10進数の引き算でも同じ桁の引き算がマイナスになる場合は、ひとつ上の桁からひとつ借りますよね? 16進数でも同じで、上の桁からひとつ借りて 2×16^4+10×16^3=1×16^4+26×16^3 として計算しています。

dsx32498
質問者

お礼

上の桁から借りるということですか! 分かりました。ありがとうございます。

  • h-mique
  • ベストアンサー率50% (16/32)
回答No.2

>(1)2AFDE-1BCDF >回答がありますが理解出来ません。 16進数だから難しいのであって、10進数で同じやり方をするとわかりやすいです。 (私はこれで16進数や8進数を理解しました) 23444-12345(10進数) これなら簡単に解けますよね? これを(1)と同じやり方にすると 23444=2x10^4 + 3x10^3 + 4x10^2 + 4x10 + 4 12345=1x10^4 + 2x10^3 + 3x10^2 + 4x10 + 5 になるわけです。 16進数は10が16になっただけ 1の位の4-5が10進数なら9になり10の位が繰り下がるが、16進数の場合、9ではなく15(F)になるだけ こうやって考えれば理解できませんか?^^

dsx32498
質問者

補足

回答ありがとうございます。 質問の計算式で、なぜ15×16^3・・・になるかが 全く分かりません。それはどの様に理解すれば良いのでしょうか?

  • hana_Z
  • ベストアンサー率17% (28/157)
回答No.1

n進数を10進数に直す方法を知れば、一挙解決。 で、方法ですが、 n進数の1桁目は、1です。 これは、nの0乗だからです。 2桁目は、nの1乗です。 3桁目は、nの2乗です。 4桁目は、nの3乗です・・・、 これが基本単位なので、 あとはそれぞれの桁がいくつあるかを見て、 かけ算していけば10進法に直せます。 なぜそうなるかって、 それは、それぞれの桁がnコ集まれば、 次の桁に繰り上がるからです。 以上。

dsx32498
質問者

お礼

そういう事ですか、どうもありがとうございました。

関連するQ&A

  • 16進数の解き方について

     現在16進数の勉強をしているのですが、10~15の数字が16進数の場合、a~fの文字になります。ですが、私にはなぜこうなるのか理解できず、A+1Fといった足し算の計算でもどういうふうに考えて解けばよいのかわかりません。 詳しくおしえて頂けたらと思います。よろしくお願いします。

  • ある法則に基づいて進数変換する際の名称について

    こんにちは。とあるファイルのバイナリ解析を行っております。 以下は16進数(左)とその16進数をある法則に基づいて変換した値(右)ですが、 このような変換方法や考え方について、何か名称はあるのでしょうか? (たとえばBCDコードですとか) 02…03 03…07 04…0F 05…1F 07…7F 08…FF 09…FF 01 0C…FF 0F 0D…FF 1F 0E…FF 3F 0F…FF 7F 10…FF FF 11…FF FF 01 22…FF FF FF FF 03 A4…FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F 法則としては、以下のような感じです。 1.左の値の分1を羅列する。 2.上記の羅列を2進数として扱い、16進数へ変換する。 例)02の場合、11→00000011(2進数)→03(16進数) 例)09の場合、111111111→11111111 00000001(2進数)→FF 01(16進数) プログラミングのカテゴリとしては相応しくないかもしれませんが、考え方など こちらで質問させていただくのが妥当かと思い、本カテゴリへ投稿いたしました。 以上、よろしくお願いします。

  • 2進数の-13の表記について

    2進数の表記について教えてください。 -13は2進数では11110011とあらわします。 なぜなら、13の2進数の00001101の2の補数だからです。 このように教わりました。 しかし、-13を11110011と表記してしまえば 10進数でいう243と表記が同じになってしまいませんか? この点がよくわかりません。 どなたか理解ある方は、教えてください。 よろしくお願い致します。

  • IEEE754と浮動小数点定数同士の演算について

    ■質問 浮動小数点の標準規格IEEE754に、浮動小数点定数同士の演算に関する規定はありますか? ■背景 とあるマイコンで組込みソフト開発をしています。 このマイコン用のコンパイラ(IEEEに準拠)で以下のCソースコードをコンパイルしたところ、コンパイラのバージョン1とバージョン2で演算結果が異なりました。 double d_val = 6.6f * 10.0f; ○コンパイルバージョン1でコンパイルしたソフトの演算結果 →d_valには66.0が代入されました。 ○コンパイルバージョン2でコンパイルしたソフトの演算結果 →d_valには65.999999…(詳細は失念)が代入されました。 コンパイラメーカーに問い合わせたところ、「バージョン1から2へのアップグレードにおいて、浮動小数点定数演算に関連する変更を行ったが、その影響は浮動小数点演算における誤差の範囲内である」との回答でした。 誤差の範囲内であるとはいえ、コンパイラのバージョン違いで演算結果が異なるのは困るので、これがIEEE754規格違反なのであれば、それを根拠にコンパイラメーカーへ対応を求められるのではないかと考えています。 しかし、浮動小数点定数同士の演算結果の正確性についての規定がないのであれば、開発側で対応するしかありません。 いろいろと調べてはいるのですが、これといった情報に行き当たっていないので、こちらで質問させていただきます。どうぞよろしくお願いいたします。

  • エクセルの演算式で困っています。

    エクセルの演算式で困っています。 セルC1,D1,E1,F1、G1の5個のセルに人数をそれぞれ入力します、そして、5個のセルの総計をH1のセルに入力します(G1の数値は、必然的にH1-(C1+D1+E1+F1) になると思います。 A3、A4,A5 と3個のセルに金額を入力します。 で、C3のセルに、(A3×C1÷H1)+(A3×1×5) の演算結果が出るようにしたいのです。つまり、C3のセルにこの演算結果が表示されるような演算を仕込みたいのです。 以下、同様に、C4のセルに、、(A4×C1÷H1)+(A4×1×5)の演算結果を表示したいのです。 また、D3のセルには、(A3×D1÷H1)+(A3×1×5) の演算結果が出るようにしたいのです。 以下、同様に、E3のセルには、、(A3×E1÷H1)+(A3×1×5) の演算結果が出るようにしたいのです。 こうなると、最後のG3のセルには、H1-(C1+D1+E1+F1) を演算式の一部に書かないといけなくなります。 で、私には手におえなくなったのです。 すいません、もし、これをご理解頂けたら、アドバイスを御願いできないでしょうか?

  • アドレスの計算が合わない

    C++でポインタの勉強をしています。 その中でアドレスについての以下のような記述がありました。 <例1> struct { int a; int b; int c; } oshiete; cout << &oshiete.a << endl; cout << &oshiete.b << endl; cout << &oshiete.c << endl; このように、構造体の中で宣言された変数の領域は連続した場所を確保するというものでした。これの実行結果は以下の様になりました。 0013FF5C 0013FF60 0013FF64 int型のバイト数は4でしたので、それぞれの変数の先頭アドレスは4つ間隔になっています。しかし、これの2つ目の変数bをshort型に変えても同じ結果が返ってくるのです。short型のバイト数は2です。 <例2> struct { int a; short b; int c; } oshiete; cout << &oshiete.a << endl; cout << &oshiete.b << endl; cout << &oshiete.c << endl; 結果: 0013FF5C 0013FF60 0013FF64 そして変数aもshort型にすると、やっと納得のいく結果になりました。 <例3> struct { short a; short b; int c; } oshiete; cout << &oshiete.a << endl; cout << &oshiete.b << endl; cout << &oshiete.c << endl; 結果: 0013FF60 0013FF62 0013FF64 なぜ<例2>ではint, short, intの順で宣言したのにアドレスが全て4つ間隔なのでしょうか?例えば先頭アドレスが0013FF5Cであるなら、 0013FF5C 0013FF60 0013FF62 のように1つ目と2つ目のアドレス差は4、2つ目と3つ目のアドレス差は2になるはずだと思うのですが。

  • 2進数の減算のオーバーフロー/アンダーフロー

    2進数の減算のオーバーフロー/アンダーフロー 2進数の加減算においてどういうときにオーバーフローするのかわかりません。 例えば、 符号付き整数加算として、 1111+0001=10000 となり、4ビットで表現しきれないので、この場合オーバーフローということでしょうか? 基本的に、元々のビット列の長さ(この場合、4ビット)を演算後、超えてしまう 結果となった場合、オーバーフロー、アンダーフローが起きていると考えてしまって よいのでしょうか? 10進数に変換して10進数の演算結果と異なることが分かれば、オーバーフローが 起きているといえるのでしょうが、ビット長が100ビットなど多ビット長の場合に そのようなことはできないので、簡単なオーバーフロー、アンダーフローの見分け方が 知りたいです。 ご回答お願い致します。

  • 結合律が成立するかどうかの判定について

    代数を勉強中です。 ある代数系(G,*)の演算*に関して演算表が与えられた場合に、その演算が結合律を満たすかどうかの判定方法を教えてください。たとえば、G={a,b,c,d}として、これについて*の演算表(4x4の大きさ)が与えられた場合、結合律が成立しているかどうかを調べるには、結合律の式 (a*b)*c=a*(b*c)のそれぞれの要素の組み合わせを変えて、しらみつぶしに成立するかどうかを調べなければならないのでしょうか?それとも、ほかにエレガントな方法があるのでしょうか?

  • 2の補数を用いた符号付10進数の変換

    次の問題の解き方を教えてください。 次の演算を、符号付2の補数を用いて計算せよ。bit数は符号を含めて6bitとする。あふれが生じたらそれを示せ。 (10)は10進数表記という意味です。 -8(10)-4(10) 15(10)-(-17(10)) 一応自分で解答は作ったのですが、合っている自信が全くないのでご回答お願いします 補足

  • 関数 陽関数 陰関数

    陽関数と陰関数について教えて下さい。 まず、陽関数と陰関数は関数における分類ではなく 形式だと理解しています。 x,yを変数、a,bを定数とする。 陽関数形式は、 y=ax^2+bのような形式。 対して、陰関数形式は、 y-ax^2-b=0のような形式。 質問(1) 陽関数形式についての疑問なのですが、 例えば、2y=ax^2+bは陽関数形式と言えるのでしょうか? y=1/2(ax^2+b)としなければ陽関数形式とは言えない のでしょうか? また陰関数形式は、必ず右辺が0でなければならない のでしょうか? 例えば、y-ax^2=bは陰関数形式と言えないのでしょうか? 質問(2) 関数は、ある値xに対してただ1つのある値yが対応するような関係 だと理解しています。 このとき、y=f(x)と表して、yはxの関数と言う。 例えば、 y^2=x⇔y=±√xです。 陽関数形式と言う場合、1対1の対応がなければいけない のでしょうか? y=±√xは陽関数形式と言えますか? y^2-x=0は陰関数形式と言えるのでしょうか? y^2=xは、y=±√xと表されyはxの関数ではありません。 陰関数形式と言う場合、1対1の対応がなければいけない のでしょうか? y^2-x=0は陰関数形式と言えますか? 以上、ご回答よろしくお願い致します。