- ベストアンサー
プログラミングで10進法を16進法に変換する方法
- プログラミング初心者のための、十進BASICを使った10進法を16進法に変換するプログラムの解説
- プログラムの意味や具体的な処理内容について分かりやすく解説します
- また、プログラムの要素についても詳しく説明し、初心者でも理解しやすいようにします
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#6です。訂正っ! hex(1)=2 16進数の1桁目 hex(2)=B 16進数の2桁目 hex(3)=A 16進数の3桁目 hex(4)=4 16進数の4桁目 じゃなくて hex(1)=2 16進数の1桁目 hex(2)=11 16進数の2桁目 hex(3)=10 16進数の3桁目 hex(4)=4 16進数の4桁目
その他の回答 (6)
- FEX2053
- ベストアンサー率37% (7991/21371)
>"0123456789ABCDEF"と y+1 ,1 は別の関係なのでしょうか? あう~・・・。 10進数の"19122"を16進数に変換することを考えて見ると、ですねえ。 30 LET dec=19122 からスタートすれば「120」の直前で hex(1)=2 16進数の1桁目 hex(2)=B 16進数の2桁目 hex(3)=A 16進数の3桁目 hex(4)=4 16進数の4桁目 になってますでしょ? で、「130」で y=hex(4)=4 ですから mid$( "0123456789ABCDEF", y+1 ,1 ) は、"0123456789ABCDEF"の「y+1」番目、即ち「4+1」番目の文字から 1文字を引っ張り出すんですから、"4"ですよね。 「y」番目を引っ張っちゃうと"5"になっちゃいますよ。 ですので「FOR」のループの1回目の「PRINT」命令は 140 PRINT "4"; になります。これを4回繰り返すと 140 PRINT "4"; 16進数の4桁目を印刷する : 140 PRINT "A"; 16進数の3桁目を印刷する : 140 PRINT "B"; 16進数の2桁目を印刷する : 140 PRINT "2"; 16進数の1桁目を印刷する になって、結果的に「4AB2」と印刷されるわけです。
- andy_kun
- ベストアンサー率23% (64/274)
ANo.4です。 >すみません、よくわかりません・・ >"0123456789ABCDEF"と y+1 ,1 は別の関係なのでしょうか? mid$は第1引数の先頭から第2引数の位置にある文字から第3引数分文字を切り出す関数です。 例えばmid$("ABCDEFGHIJKLMNOPQRSTUVWXYZ",10,1)の場合は、Jが切り出され、mid$("ABCDEFGHIJKLMNOPQRSTUVWXYZ",8,2)だとHIが切り出されます。 今回の場合では"0123456789ABCDEF"の先頭からy+1番目の文字から1文字切り出します。 yには16進数の各桁の値(0~15)が入っています。 y+1から文字を切り出すことによって16進表記の値が表示されるようになります。
お礼
これも理解できました! mid$("ABCDEFGHIJKLMNOPQRSTUVWXYZ",8,2)てのは、 前から8番目を二文字切り出す、ということですよね。 ご丁寧にありがとうございます。
- andy_kun
- ベストアンサー率23% (64/274)
>16のところを2に、140を、01にすると10進数から2進数へ変換する >プログラムになるでよかったでしょうか? まぁ140行目は変えなくても動きます。 ただし20行目は配列数を変更する必要があります。 30行目でdecに16ビットの最大値を入れていますから配列の要素は16必要です。 プログラムはこんな感じです。 10 !2進数に変換する 20 DIM bin(16) 30 LET dec=65535 40 LET p=1 50 DO WHILE 2<=dec 60 LET bin(p) = MOD(dec,2) 70 LET dec = INT(dec/2) 80 LET p=p+1 90 LOOP 100 LET bin(p) = dec 110 !bin(p) ~ bin(1) 120 FOR i=p TO 1 STEP -1 130 LET y=bin(i) 140 PRINT mid$("0123456789ABCDEF",y+1,1); 150 NEXT i 160 END
お礼
ありがとうございます。理解しました! 140は"01"でも大丈夫ですよね?
- FEX2053
- ベストアンサー率37% (7991/21371)
>mid$は何のことで、かっこ内の,y+1,1は何を表しているのでしょうか。 Excelと同じです。 初めから「y+1」番目の文字から「1」文字切り出すという関数です。 "012・・・"の1番目の文字は"0"なので、「y+1」番目を切り出さないと 「変換した16進数」と合いませんよね。 >この50は、入力する数値が16以上、ということでしょうか? decが16以下ならば、余りと(mod関数で出てきますね)商を引っ張り 出すという処理が入ってるだけですよ。例えば15なら、余り15と商0 が出て、ループを1回も回らず飛び出しますよね。 逆に言えば、この処理ではマイナスや小数の処理は出来ません。 たぶん次のステップで、そういう場合にどう処理するかが問われますよ。 ご自分で考えて見てください。 >16のところを2に、140を、01にすると10進数から2進数へ変換する >プログラムになるでよかったでしょうか? 検証してませんが、なりそうな気はします。
お礼
>Excelと同じです。 初めから「y+1」番目の文字から「1」文字切り出すという関数です。 "012・・・"の1番目の文字は"0"なので、「y+1」番目を切り出さないと 「変換した16進数」と合いませんよね。 すみません、よくわかりません・・ "0123456789ABCDEF"と y+1 ,1 は別の関係なのでしょうか? >decが16以下ならば、余りと(mod関数で出てきますね)商を引っ張り 出すという処理が入ってるだけですよ。例えば15なら、余り15と商0 が出て、ループを1回も回らず飛び出しますよね。 こちらは理解しました。 >逆に言えば、この処理ではマイナスや小数の処理は出来ません。 たぶん次のステップで、そういう場合にどう処理するかが問われますよ。 ご自分で考えて見てください。 確かに・・ということはこの流れプログラミングではダメということですよね。 実際このプログラムも実行できるプログラムを理解する、といった形なので、はじめから自分で作成するとなると、困りました、ツライです・・
- FEX2053
- ベストアンサー率37% (7991/21371)
「30」が変換する元の10進数ですね。 「50」~「90」で、「30」の値を16で割った余りを順に出しています。 これって「下の桁から16進数に変換」していることになりますよね。 ですので「hex(i)」はi=1から順に「16進数の各桁の値」が入っています。 ただし、このままでは[10]~[16]の値が[A]~[F]では表示できません。 こいつを変換するのが「120」~「150」です。要は「前から何番目」 で単純に「文字」を与えているだけです。PRINT命令に改行コードが 入っていませんので、値は行を変えずにそのまま次々打ち出されると 言うわけです。
お礼
ただし、このままでは[10]~[16]の値が[A]~[F]では表示できません。 こいつを変換するのが「120」~「150」です。要は「前から何番目」 で単純に「文字」を与えているだけです。PRINT命令に改行コードが 入っていませんので、値は行を変えずにそのまま次々打ち出されると 言うわけです。 なるほど!ご丁寧にありがとうございます。 mid$( "0123456789ABCDEF", y+1 ,1 ); の mid$は何のことで、かっこ内の,y+1,1は何を表しているのでしょうか。 もう一点、この50は、入力する数値が16以上、ということでしょうか? プログラミングは16以下の数値を入れても動きます。 ちなみに、16のところを2に、140を、01にすると10進数から2進数へ変換するプログラムになるでよかったでしょうか?
- ahirudac
- ベストアンサー率46% (84/180)
(1):10からの推測になりますがコメント行と思われます。 (2):Aでも問題ないと思います。 (3):nでも問題ないと思います。 (4):ご推測の通りと思います。 (3)(4)に関してですが、配列や変数名はなんでもかまわないと言えばかまわないと思いますが、後で見て分かりやすい名前が好ましいと思います。特にnといった変数名はループ文中で使うことがあると思われますので。
お礼
迅速にありがとうございます。 プログラミングに慣れておらず、臨機応変できないので、 hex、decは、文字自体が何かを表しているのかと思っていました。 ありがとうございます。
お礼
たびたびのご回答ありがとうございます。 丁寧に教えてくださったので、この問題に関してはきちんと理解できました。 マイナスと少数は・・・・次に置いておきます。 本当にありがとうございました!!