先日、学校で2進数について習ったのですが、宿題でn進小数を2、8、16進数に変換する問題がでてぜんぜん解けなくて困ってます。どなたか、教えてください。

 (98.75)10を2、8、16進数に
 
 (1A.C)16を2、8、16進数に

 (12.14)8を2,8,16進数に
の3問でお願いします。(xxx)8は、8進数でxxxと表現しました。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

 


  n進数というのは、或る桁に数字があると、それが、何桁目かによって、nの何乗という数字をその桁の係数にかけて合計を出すと、とりあえず、10進数に換算できます。そこで、10進数で表現されている数字を、今度はm進数に変えようとすると、mで順番に割って行き、余りで、最初の桁から順番にその桁の係数を計算して出します。具体的に次のように計算します。
 
  例えば、98.75 /10/ なら、2で割ると、98は49になり余りがありません。これは最初の桁が、0ということです。最初の桁とは、一桁目です。次に49を2でまた割ると、24……1 となります、つまり、二番目の桁、第二の桁は1です。24をまた2で割ると、割り切れます。ということで:
 
  98/2=49……0
  49/2=24……1
  24/2=12……0
  12/2= 6……0
   6/2= 3……0
   3/2= 1……1
   1/2= 0……1
 
  ということで、1より大きい部分は、1100010 になります。これは、
  1*2^6+1*2^5+0*2^4+0*2^3+0*2^2+1*2^1+0*2^0=64+32+0+0+0+2+0=98
  ということで、この計算でよいことが分かります。(注:0100011 でないのに注意)。
 
  少数の方も同じで、違うのは、1/2が幾つあるか、1/4が幾つあるかという計算になり、これは、1/2で割ることなので、丁度、その逆数の2を掛けて行くことになります。
 
  0.75X2=1.5……1と0.5
  0.5 X2=1……1と0 です。
  つまり、1*(1/2)^1+1*(1/2)^2=1/2+1/4=0.5+0.25=0.75
  だから、2進数で、小数点の部分は、0.11 になります。
 
  上の結果と合わせると(98.75)10=(1100010.11)2 が答えです。
 
  8進数、16進数も同じように計算してもよいのですが、ここは頭を使います。
  2^3=8,2^4=16 というのを利用します。((1/2)3=1/8,(1/2)4=1/16 も使います)。
  (98.75)10=(1100010.11)2=1*2^6+1*2^5+0*2^4+0*2^3+0*2^2+1*2^1+0*2^0+1*(1/2)^1+1*(1/2)^2
  でしたから、
  2^6=(2^3)*(2^3)=8^2*1
  2^5=(2^3)*(2^2)=8^1*4
  2^1=8^0*2
  で、少数でない部分は、142となります。
 
  また少数部分は、(1/2)3=1/8 ですから、
  1*(1/2)^1+1*(1/2)^2=4*(1/8)^1+2*(1/8)^1=(0.6)8 となり、合計すると、
  (98.75)10=(142.6)8 が答えです。
 
  16進数換算は、2^4=16,(1/2)^4=1/16 を使って同じように計算します。
 
  (98.75)10=(1100010.11)2=1*2^6+1*2^5+0*2^4+0*2^3+0*2^2+1*2^1+0*2^0+1*(1/2)^1+1*(1/2)^2
  =4*2^4+2*2^4+2*2^0+8*(1/2)^4+4*(1/2)^4=(62./12/)8=(62.C)8……Cは12です。
  (98.75)10=(62.C)8 が答えです。
 
  ここで、2進数を8進数にする場合は、三桁づつ分ければよく、16進数の場合は、四桁づつに分ければよいという技術が出てくるのです。どうしてそうなるかは、以上の計算方法を考えると、分かると思います。(よく考えてください)。
 
  この三桁づつ分ける、四桁づつ分けるというのを使うとどうなるかは、
 
  (98.75)10=(1100010.11)2=(1|100|010.110|)2=(142.6)8
  (98.75)10=(1100010.11)2=(110|0010.1100|)2=(62./12/)8=(62.C)8
 
  となって、簡単に計算できます。三桁づつ、四桁づつ切った中で、2進数の合計を計算して、これを、その桁の数字にすればよいのです。まず、2進数にすると、8進数と16進数は、こんな風に簡単に計算できます。
 
 
  >(1A.C)16を2、8、16進数に
 
  (1A.C)16=1*16^2+10*16^0+12*(1/16)^1
  =(|0001|1010.1100|)2=(11010.11)2
  いきなり答えがでますが、これは何をしたかというと、16進数→2進数の上で述べた、桁を四つごとに分けることの逆をしたのです。2進数から16進数へと進んで見ると、そういう計算をしているのが分かるでしょう。
  (1A.C)16=(11010.11)2=(11|010.110|)2=(32.6)8
 
  最後は、多分、10進数への変換でしょう。
  それは簡単にできます。
  (11010.11)2=16+8+0*4+2+0*1+(1/2)+(1/2)^2=(26.75)10
 
 
  >(12.14)8を2,8,16進数に
 
  (12.14)8=1*8^1+2*8^0+1*(1/8)+4*(1/8)^2
  8=2^3 で (1/8)=(1/2)3 であるので
  (12.14)8=1*2^3+2*2^0+1*(1/2)^3+4(1/2)^6
    ここで、2*2^0=1*2^1  4(1/2)^6=1*(1/2)^4  従って
  (12.14)8=1*2^3+2*2^0+1*(1/2)^3+4(1/2)^6=1*2^3+1*2^1+1*(1/2)^3+1*(1/2)^4
  =(1010.0011)2
 
  (1010.0011)2=(|1010.0011|)2=(/12/.3)16=(C.3)16
 
  10進数への換算は、2進数が出ているのでそれを元に計算できるし、16進数でC.3ということは、1*16+3*(1/16) であり、これを計算すると、(16.1875)10
 
  なお、途中で計算間違いをしているかも知れません。
  検算してください。
 
    • good
    • 0

少数部分は、分数で考えて、分母が(10^x)n になるようにします。



(0.75)10
= (75/100)10
= (3/4)10
= (11/100)2 = (0.11)2
= (3/4)8 = (6/10)8 = (0.6)8
= (3/4)16 = (C/10)16 = (0.C)16

(1A.C)16 は、サービス問題ですね。
(12.14)8 は、やや複雑ですが、基本的な事がわかってしまえば簡単です。

(0.14)8
= (14/100)8
= (12/64)10 = (3/16)10 = (1875/10000)10 = (0.1875)10

あとは頑張ってください。
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Q2,7,1,4,7,2,8,1,4,1,6,..

初項を2、第2項を7とします
すべての項は一桁とします。
隣り合う項をかけてその結果を数列の最後につけていくとします
(説明が下手でごめんなさい。。。)
つまり
2,7,1,4,7,2,8,1,4,1,6,...
といった具合です。
これが6を無限個含むことを示せという問題なんですが、見当がまったくつかず。。。
ちょっと思いついたのは偶数をかけるとどんな数字でも一桁目は偶数になるので、偶数は無限個あるというのだけで、、、
規則性が見えるかなとおもっていろいろ書き出したのですが、何もわからず。。。

ヒントでもいいのでお願いします

Aベストアンサー

> 隣り合う項をかけてその結果を数列の最後につけていくとします
> 2,7,1,4,7,2,8,1,4,1,6,...

> といった具合です。

どういう規則なのか、さっぱり分からんですね。もしかして、この例が間違っているんじゃないでしょうか?

 仮に、この例が間違いだとして、「隣り合う項をかけてその結果を数列の最後につけていく」をやってみると
27
2.714
27.147
271.474
2714.7428
27147.42828
271474.28288
2714742.828816
27147428.2881616
が正しいのだとしましょう。("."は掛け算をやった位置を表しています)

 さて、「数列には6が高々有限個しか現れない」と仮定すると、数列のある場所N項目から以降には6が一つもないような、そういうNが存在しなくてはならない。

 一方、数列中にひとたび(1616)が現れると、それより後ろに(666)が出て来る。
 (666)が現れると、それより後ろに(363636)が出て来る。
 (363636) が現れると、それより後ろに (1818181818) が現れ、さらにその後ろに (888888888) が現れ、さらにその後ろに(6464…6464) が出て来る。
 (6464…6464) が現れると、それより後ろに (2424…24) が現れ、さらにその後ろに (88…8) が現れ、さらにその後ろに (6464…6464) が出て来る。
 (6464…6464) が現れると、それより後ろに (2424…24) が現れ、さらにその後ろに (88…8) が現れ、さらにその後ろに (6464…6464) が出て来る。
  :
 ループです。つまり、どこまで行っても、それより後ろに(6464…6464)という部分が必ず存在する。

 だから、「数列のある場所N項目から以降には6が一つもないような、そういうN」は存在しない。
 

> 隣り合う項をかけてその結果を数列の最後につけていくとします
> 2,7,1,4,7,2,8,1,4,1,6,...

> といった具合です。

どういう規則なのか、さっぱり分からんですね。もしかして、この例が間違っているんじゃないでしょうか?

 仮に、この例が間違いだとして、「隣り合う項をかけてその結果を数列の最後につけていく」をやってみると
27
2.714
27.147
271.474
2714.7428
27147.42828
271474.28288
2714742.828816
27147428.2881616
が正しいのだとしましょう。("."は掛け算をやった位置を表しています)

 さ...続きを読む

Qx1=(1,1,1),x2=(1,1,-1),x3=(1,-1,-1)をC^3の基底,{y1,y2,y3}がその双対基底でx=(0,1,0)の時,y1(x),y

[問] ベクトルx1=(1,1,1),x2=(1,1,-1),x3=(1,-1,-1)をC^3の基底とする。
{y1,y2,y3}がその双対基底でx=(0,1,0)の時、
y1(x),y2(x),y3(x)を求めよ。

という問題の解き方をお教え下さい。

双対基底とは
{f;fはF線形空間VからFへの線形写像}
という集合(これをV*と置く)において、
V(dimV=nとする)の一組基底を{v1,v2,…,vn}とすると
fi(vj)=δij(:クロネッカーのデルタ)で定めるV*の部分集合
{f1,f2,…,fn}はV*の基底となる。これを{v1,v2,…,vn}の双対基底と呼ぶ。

まず、
C^3の次元は6(C^3の基底は(1,0,0),(0,1,0),(0,0,1),(i,0,0),(0,i,0),(0,0,i))
だと思うので上記のx1,x2,x3は基底として不足してると思うのです(もう3ベクトル必要?)。

うーん、どのようにしたらいいのでしょうか?

Aベストアンサー

>C^3の次元は6(

これが間違え.
「x1=(1,1,1),x2=(1,1,-1),x3=(1,-1,-1)をC^3の基底」
といってるんだから,係数体はRではなく,C.

あとは定義にしたがって,
dualな基底を書き下せばいいだけ.
y1(x1)=1,y1(x2)=y1(x3)=0であって
v=ax1+bx2+cx2と表わせるわけだし,
v=(v1,v2,v3)とすれば,a,b,cはv1,v2,v3で表現できる
#単なる基底変換の問題.

Q循環小数の進数変換について質問です。次の16進数を10進数に直したいの

循環小数の進数変換について質問です。次の16進数を10進数に直したいのですが、どうすればよいのかわかりません;どなたかお力添えをお願いします。

(1)0.2222222222222222…

(2)0.6666666666666666…

Aベストアンサー

(1)だけ
2×(1/16)+2×(1/16)^2+2×(1/16)^3+…
=(2/16)/(1-1/16)=2/15です。

2番目のイコールには等比数列の和の公式を使っています。

Qにゃんこ先生の自作問題、1,2,2,3,3,3,4,4,4,4,5,…の一般項をガウス記号を用いて書くには?

にゃんこ先生といいます。

1,2,2,3,3,3,4,4,4,4,5,…
という群数列の一般項を、ガウス記号などを用いて書くとどうにゃるのでしょうか?
a[n]=k
とすると、
第k群の最後の項は、
1+2+…+k=k(k+1)/2
より第k(k+1)/2項にゃので、
(k-1)k/2 < n ≦ k(k+1)/2
をkについて解けばいいのですが、具体的にはどうかけるのでしょうか?

また、
1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,…
という群数列の一般項を、ガウス記号などを用いて書くとどうにゃるのでしょうか?

Aベストアンサー

※再訂正
ANo.1の結果
  An = k = [k] = [1 + √(8n - 7)]
   訂正 ⇒ An = [(1 + √(8n - 7))/2]

※追加
Excelで確認してみました.第16項まで表示しています.
○1つ目の群数列
n  (-1 + √(8n + 1))/2   (1 + √(8n - 7))/2    An
1      1            1            1
2      1.562          2            2
3      2            2.562          2
4      2.372          3            3
5      2.702          3.372          3
6      3            3.702          3
7      3.275          4            4
8      3.531          4.275          4
9      3.772          4.531          4
10      4            4.772          4
11      4.217          5            5
12      4.424          5.217          5
13      4.623          5.424          5
14      4.815          5.623          5
15      5            5.815          5
16      5.179          6            6

○2つ目の群数列
n   log(n + 1)/log2      log2n/log2       An
1      1            1            1
2      1.585          2            2
3      2            2.585          2
4      2.322          3            3
5      2.585          3.322          3
6      2.807          3.585          3
7      3            3.807          3
8      3.170          4            4
9      3.322          4.170          4
10      3.459          4.322          4
11      3.585          4.459          4
12      3.700          4.585          4
13      3.807          4.700          4
14      3.907          4.807          4
15      4            4.907          4
16      4.087          5            5

切り上げの関数を用いれば,左側でも表せますね.

※再訂正
ANo.1の結果
  An = k = [k] = [1 + √(8n - 7)]
   訂正 ⇒ An = [(1 + √(8n - 7))/2]

※追加
Excelで確認してみました.第16項まで表示しています.
○1つ目の群数列
n  (-1 + √(8n + 1))/2   (1 + √(8n - 7))/2    An
1      1            1            1
2      1.562          2            2
3      2            2.562          2
4      2.372          3  ...続きを読む

Q関数f(x1,x2,x3,x4,x5)が最大値となるようなx1,x2,x3,x4,x5の求め方

変数を5つもつ関数f(x1,x2,x3,x4,x5)があります。
関数f(x1,x2,x3,x4,x5)は、一言では言い表せないような複雑な式とします。

y=f(x1,x2,x3,x4,x5)としたとき、
yが最大になるようなx1,x2,x3,x4,x5はどのようにして求めればよいでしょうか?

例えば、、、

(1) x2,x3,x4,x5を適当な値に固定し、x1を変化させてyが最大となるようなx1を求める。(このときのx1をaとする)

(2) x1をaに、x3,x4,x5を適当な値に固定し、x2を変化させてyが最大となるようなx2を求める。(このときのx2をbとする)

(3) x1をaに、x2をbに、x4,x5を適当な値に固定し、x3を変化させてyが最大となるようなx3を求める。(このときのx3をcとする)

(4) x1をaに、x2をbに、x3をcに、x5を適当な値に固定し、x4を変化させてyが最大となるようなx4を求める。(このときのx4をdとする)

(5) x1をaに、x2をbに、x3をcに、x4をdに固定し、x5を変化させてyが最大となるようなx5を求める。(このときのx5をeとする)

このとき、f(a,b,c,d,e)は最大値??
多分、違いますよね。

変数を5つもつ関数f(x1,x2,x3,x4,x5)があります。
関数f(x1,x2,x3,x4,x5)は、一言では言い表せないような複雑な式とします。

y=f(x1,x2,x3,x4,x5)としたとき、
yが最大になるようなx1,x2,x3,x4,x5はどのようにして求めればよいでしょうか?

例えば、、、

(1) x2,x3,x4,x5を適当な値に固定し、x1を変化させてyが最大となるようなx1を求める。(このときのx1をaとする)

(2) x1をaに、x3,x4,x5を適当な値に固定し、x2を変化させてyが最大となるようなx2を求める。(このときのx2をbとする)

(3) x1...続きを読む

Aベストアンサー

まず最初に、この「一言では言い表せないような複雑な」関数が「連続」である必要があります。不連続の場合は初期値(「x2,x3,x4,x5を適当な値に固定し」に相当)から最大値に至る探索の道筋の手がかりがなにも無い事になってしまいますから。

次に、この方法で最大値が求まるためは、2次元で考えたとして山の頂上(y の最大値に相当)がパラメータx1,x2,x3,x4,x5の値域内でひとつだけである必要があります。山で例えると富士山(頂上の火口付近のくぼみは無視して)のような山です。そうでない場合、つまり、例えば八ヶ岳のように複数の頂上があった場合、見つかった値は最大値とは限りません。つまり八ヶ岳のひとつの頂上が見つかっただかで、これが八ヶ岳で一番高い頂上かどうかは分からないということです。こうして見つかった y の値を「局所最大値」と呼びます。確実に(局所でない大局的な)最大値を見つける方法は見つかっていません。

質問者さんの方法でも(局所)最大値は見つかりますが、多くの場合、x1~x5 をそれぞれ少しだけ値を振って(Δx)、その時の y の変化が大きい方に、より動いていく、というやり方をします。例えて言えば、山登りで霧がたち込めていて頂上が見えない場合、足下の周辺の地面だけを見て、最も傾斜が急な方向に次の一歩を踏み出す(次の x1~x5 を決める)わけです。この方法は No.1 さんのおっしゃるように「山登り法」と呼ばれており、質問者さんの方法より速く(少ない歩数で)(局所)最大値に達することができます。

歩幅の大きさにも注意が必要です。頂上や山の大きさに関係するのですが、多くの場合「一言では言い表せないような複雑な」訳で、山の大きさすら分かりません。一歩の大きさを大きくすればそれだけ速く頂上に到達できますが、頂上の正確な位置がでませんし、山よりも大きな歩幅ですと山を飛び越えてしまいますので、「十分に」小さな値にします。計算を速くするために、最初の歩幅は大きく、段々歩幅を小さくするというやり方もあります。

より詳しくは「山登り法」で検索されるといろいろと見つかると思います。

まず最初に、この「一言では言い表せないような複雑な」関数が「連続」である必要があります。不連続の場合は初期値(「x2,x3,x4,x5を適当な値に固定し」に相当)から最大値に至る探索の道筋の手がかりがなにも無い事になってしまいますから。

次に、この方法で最大値が求まるためは、2次元で考えたとして山の頂上(y の最大値に相当)がパラメータx1,x2,x3,x4,x5の値域内でひとつだけである必要があります。山で例えると富士山(頂上の火口付近のくぼみは無視して)のような山です。そうでない場合、つまり、...続きを読む


人気Q&Aランキング

おすすめ情報