プログラミングで10進法を16進法に変換する方法

このQ&Aのポイント
  • プログラミング初心者のための、十進BASICを使った10進法を16進法に変換するプログラムの解説
  • プログラムの意味や具体的な処理内容について分かりやすく解説します
  • また、プログラムの要素についても詳しく説明し、初心者でも理解しやすいようにします
回答を見る
  • ベストアンサー

プログラミング 十進BASIC

はじめまして。 パソコン超初心者のものです。 十進BASICで10進法を16進法に変換するプログラムを以下のように作成したとき、文字の表している意味がわからず、120から表現しているようなことはわかる気がするのですがいまいちはっきりわかりません。わかるかた教えていただけないでしょうか。よろしくお願いいたします。 10  !16進法に変換する     20  DIM hex(4) 30 LET dec=65535 40 LET p=1 50 DO WHILE 16<=dec 60 LET hex(p)=MOD(dec,16) 70 LET dec=INT(dec/16) 80 LET p=p+1 90 LOOP 100 LET hex(p)=dec 110 ! hex(p) ~ hex(1) 120 FOR i=p TO 1 STEP -1 130 LET y=hex(i) 140 PRINT mid$( "0123456789ABCDEF", y+1 ,1 ); 150 NEXT i 160 END (1)「!」の意味は何ですか?日本語を入力するときに使うのかな?なんて思っていますが・・ (2)hexは何ですか。Dimは配列なのはわかります。Aとかでも問題ないのでしょうか? (3)decは何ですか。代入する数値のことだと思うのですが、nとかではダメなのでしょうか。 (4)140の意味。11をA、12をB・・と書くためのものですか? 詳しく教えていただけないでしょうか。

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

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.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% (7987/21354)
回答No.6

>"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」と印刷されるわけです。

nattin_111
質問者

お礼

たびたびのご回答ありがとうございます。 丁寧に教えてくださったので、この問題に関してはきちんと理解できました。 マイナスと少数は・・・・次に置いておきます。 本当にありがとうございました!!

  • andy_kun
  • ベストアンサー率23% (64/274)
回答No.5

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進表記の値が表示されるようになります。

nattin_111
質問者

お礼

これも理解できました! mid$("ABCDEFGHIJKLMNOPQRSTUVWXYZ",8,2)てのは、 前から8番目を二文字切り出す、ということですよね。 ご丁寧にありがとうございます。

  • andy_kun
  • ベストアンサー率23% (64/274)
回答No.4

>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

nattin_111
質問者

お礼

ありがとうございます。理解しました! 140は"01"でも大丈夫ですよね?

  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.3

>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進数へ変換する >プログラムになるでよかったでしょうか? 検証してませんが、なりそうな気はします。

nattin_111
質問者

お礼

>Excelと同じです。 初めから「y+1」番目の文字から「1」文字切り出すという関数です。 "012・・・"の1番目の文字は"0"なので、「y+1」番目を切り出さないと 「変換した16進数」と合いませんよね。 すみません、よくわかりません・・ "0123456789ABCDEF"と y+1 ,1 は別の関係なのでしょうか? >decが16以下ならば、余りと(mod関数で出てきますね)商を引っ張り 出すという処理が入ってるだけですよ。例えば15なら、余り15と商0 が出て、ループを1回も回らず飛び出しますよね。 こちらは理解しました。 >逆に言えば、この処理ではマイナスや小数の処理は出来ません。 たぶん次のステップで、そういう場合にどう処理するかが問われますよ。 ご自分で考えて見てください。 確かに・・ということはこの流れプログラミングではダメということですよね。 実際このプログラムも実行できるプログラムを理解する、といった形なので、はじめから自分で作成するとなると、困りました、ツライです・・

  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.2

「30」が変換する元の10進数ですね。 「50」~「90」で、「30」の値を16で割った余りを順に出しています。 これって「下の桁から16進数に変換」していることになりますよね。 ですので「hex(i)」はi=1から順に「16進数の各桁の値」が入っています。 ただし、このままでは[10]~[16]の値が[A]~[F]では表示できません。 こいつを変換するのが「120」~「150」です。要は「前から何番目」 で単純に「文字」を与えているだけです。PRINT命令に改行コードが 入っていませんので、値は行を変えずにそのまま次々打ち出されると 言うわけです。

nattin_111
質問者

お礼

ただし、このままでは[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)
回答No.1

(1):10からの推測になりますがコメント行と思われます。 (2):Aでも問題ないと思います。 (3):nでも問題ないと思います。 (4):ご推測の通りと思います。 (3)(4)に関してですが、配列や変数名はなんでもかまわないと言えばかまわないと思いますが、後で見て分かりやすい名前が好ましいと思います。特にnといった変数名はループ文中で使うことがあると思われますので。

nattin_111
質問者

お礼

迅速にありがとうございます。 プログラミングに慣れておらず、臨機応変できないので、 hex、decは、文字自体が何かを表しているのかと思っていました。 ありがとうございます。

関連するQ&A

  • 文字型変数を使って2進数表示すると、最上位ビットに1を立てると値に-記号が入ってしまいます

    VB6.0 WindowsXP 掲題の件ですが以下のコードを使って16進数を2進数表示にしていますが、最上位ビットに1を立てると値がおかしくなってしまいます。 Private Sub Form_Load() Dim dat(5) As Variant Dim i As Variant dat(0) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFF)), 16) dat(1) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFE)), 16) dat(2) = Right("0000000000000000" & Hex2Bin(Hex(&HFF00)), 16) dat(3) = Right("0000000000000000" & Hex2Bin(Hex(&HF000)), 16) dat(4) = Right("0000000000000000" & Hex2Bin(Hex(&HF0F0)), 16) dat(5) = Right("0000000000000000" & Hex2Bin(Hex(&H7FFF)), 16) For i = 0 To 5 Label1.Caption = Label1.Caption & dat(i) & vbCrLf Next Label2.Caption = "FFFF" & vbCrLf & "FFF0" & vbCrLf & "FF00" & vbCrLf & "F000" & vbCrLf & "F0F0" End Sub Public Function Hex2Bin(Hex) Dim Dec Dec = CInt("&H" + Hex) Hex2Bin = Dec2Bin(Dec) End Function Public Function Bin2Hex(Bin) Dim Dec Dec = Bin2Dec(Bin) Bin2Hex = Hex(Dec) End Function Public Function Dec2Bin(ByVal Dec) Do Dec2Bin = CStr(Dec Mod 2) & Dec2Bin Dec = Dec \ 2 Loop Until Dec = 0 End Function Public Function Bin2Dec(Bin) Dim i As Integer For i = 1 To Len(Bin) Bin2Dec = Bin2Dec * 2 + CInt(Mid(Bin, i, 1)) Next End Function なぜこうなってしまうのか、最上位に1を入れても1000000000000 のように表示させるにはどうしたらよいか教えていただきたいです。 よろしくお願いします。

  • 十進BASICでの衝突プログラミング

    十進ベーシック超初心者です。二次元の箱の中に円を置き、そこで衝突を繰り返すプログラムをつくりたいのですが行き詰っています。 箱の中だけでの衝突は、以下のようにプログラムできたのですが、円にぶつかるときどのようにプログラムをくんで跳ね返させればいいかわかりません。どなたか教えて下さい。 SET WINDOW -20,20,-20,20 DRAW GRID(2,2) PLOT LINES: -10,-10 ;10,-10;10,10;-10,10;-10,-10 DRAW CIRCLE WITH SCALE (2) LET X=-10 LET Y=-10 LET T=0 LET V=4.53574748 LET A=56.654968 LET VX=COS(A) LET VY=SIN(A) 100 PLOT LINES:X,Y ; IF VX>0 THEN LET LX=20-(10+X) END IF IF VX<0 THEN LET LX=20-(10-X) END IF IF VY>0 THEN LET LY=20-(10+Y) END IF IF VY<0 THEN LET LY=20-(10-Y) END IF LET T=MIN(LX/ABS(VX),LY/ABS(VY)) LET X=VX*T+X LET Y=VY*T+Y IF T=LX/ABS(VX) THEN LET VX=-VX END IF IF T=LY/ABS(VY) THEN LET VY=-VY END IF GOTO 100 END

  • 十進BASICでのsin(x)の近似のグラフ化について

    十進BASICを使っています。 sin(x)=x-x^3/3!+x^5/5!-... について、グラフで確かめようと思いプログラミングしてみたんですが、3行目でt=36以上にするとグラフが描かれなくなってしまいます。 どこを直せばt>35でもグラフが描かれるようになるのか教えていただけないでしょうか。よろしくおねがいします。 LET w=30 LET s=0.1 LET t=30 DIM p1(t) DIM p2(t) SET WINDOW -w,w,-w,w SET POINT STYLE 1 DRAW AXES0 FOR n= 1 TO t LET p1(n)=(-1)^(n+1) LET p2(n)=2*n-1 NEXT n SET LINE COLOR 15 FOR x= -w TO w STEP s LET y=SIN(x) PLOT LINES: x,y; NEXT x PLOT LINES SET LINE COLOR 1 FOR x= -w TO w STEP s WHEN EXCEPTION IN LET y=0 FOR n= 1 TO t LET y=y+p1(n)*x^p2(n)/FACT(p2(n)) NEXT n PLOT LINES: x,y; USE PLOT LINES END WHEN NEXT x END

  • 十進BASICのプログラムについて

    十進BASICのプログラムについて 小町算のプログラムですが、 100 DIM s(9) 110 FOR i=1 TO 9 120 LET s(i)=-1 130 NEXT i 140 DO 150 LET sum=0 160 LET num=0 170 LET sign=1 180 FOR i=1 TO 9 190 IF s(i)<>0 THEN 200 LET sum=sum+sign*num 210 LET sign=s(i) 220 LET num=i 230 ELSE 240 LET num=10*num+i 250 END IF 260 NEXT i 270 LET sum=sum+sign*num 280 IF sum=100 THEN 290 FOR i=1 TO 9 300 IF s(i)= +1 THEN PRINT " + "; 310 IF s(i)= -1 THEN PRINT " - "; 320 PRINT i; 330 NEXT i 340 PRINT " = 100" 350 END IF 360 LET i=9 370 LET sign=s(i)+1 380 DO WHILE ( sign > 1 ) 390 LET s(i)=-1 400 LET i=i-1 410 LET sign=s(i)+1 420 LOOP 430 LET s(i)=sign 440 LOOP WHILE ( s(1) < 1) 450 END というものですが、このプログラム中にあるsum、num、signとはどういう意味があるのでしょうか?

  • ベーシック、循環小数プログラミング

    0 !q/pを少数点表示する 1 LET X=10 2 DIM a(1 TO 100),b(0 TO 100) 3 INPUT q,p 4 LET b(0)=q 5 LET k=1 6 DO 7 LET a(k)=INT(b(k-1)*X/p) 8 LET b(k)=MOD(b(k-1)*X,p) 9 LET j=0 10 DO UNTIL j=k-1 OR b(j)=b(k) 11 LET j=j+1 12 LOOP 13 IF b(j)=b(k) THEN EXIT DO 14 LET k=k+1 15 LOOP 16 ! 結果の表示 17 PRINT "0."; 18 FOR i=1 TO j 19 PRINT a(i); 20 NEXT i 21 PRINT "{"; 22 FOR i=j+1 TO k 23 PRINT a(i); 24 NEXT i 25 PRINT "}" 26 END 上のプログラミングですが、 10~16、21~26がはっきりと理解できません。 6のdoは15のloopとつながるんですよね? q=3,p=7で考えてみたのですが、 8,9行目で a(1)=4 b(0)=3 b(1)=2 a(2)=2 b(2)=6 a(3)=8 b(3)=4 a(4)=5 b(4)=5 a(5)=7 b(5)=1 a(6)=1 b(6)=3 となり、b(0)=b(6)より、循環小数ということだと考えました。 このb(0)=b(6)の比較は10行目、13行目のどちらでしょうか? また、結果の表示で、17行~20行で、 0.a1a2a3・・と表示することはわかりましたが、循環小数のさいの{}の入れ方(21行~25行)が理解できていません。 私の理解や記入がわかりにくいかもしれませんが、 どなたか解説していただけないでしょうか。 よろしくお願いいたします。

  • プログラミングVisual Basicの質問です。

    任意の数字を入力し、Len関数とMid関数を使って2進数を10進数に変換するというプログラムを作っているのですが、うまくいきません。 コードは Dim a  As Integer Dim b  As Integer Dim i  As Integer a = Val(TextBox1.Text) For i = Len(a) To 1 Step -1 If Mid(a, Len(a), 1) = "1" Then b += 2 ^ (i - 1) End If Next Label3.Text = b    End Sub 上記のものが作ったコードです。 問題点の指摘をよろしくお願いします。

  • 独学で最近c言語を始めたものです。10進数を16進数に変換するプログラ

    独学で最近c言語を始めたものです。10進数を16進数に変換するプログラムを作りました。 しかしコンパイルしてもエラーは出ないのですがprintfの部分で配列の結果のみが出ません。 如何せん、独学ですので気付かないところで簡単なミスをしているかもしれませんが、分かる方がいましたご教授ください。 #include<stdio.h> int main() { static char data[16]= {'1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char hex[5]; short dec,num,i; for(;;){ for(i=0;i<=3;i++) hex[i]=' '; hex[4]='\0'; printf("10進数を入力してください。>>"); scanf("%d",&dec); if(dec==0) break; for(i=3;dec!=0;i--){ num=dec%16; dec/=16; hex[i]=data[num]; } printf("16進数は%sです\n",hex); } }

  • プログラミングの問題です

    このプログラムは何をするものか詳しく説明しなさい。 100 FOR x=1 TO 100 110 FOR y=x TO 100 120 LET a=x 130 LET b=y 140 DO 150 LET r=MOD(a,b) 160 IF r=0 THEN EXIT DO 170 LET a=b 180 LET b=r 190 LOOP 200 IF b=1 THEN 210 LET z=SQR(x^2+y^2) 220 IF INT(z)=z THEN PRINT x,y,z 230 END IF 240 NEXT y 250 NEXT x プログラムに関して初心者で、120~230(ほとんどですが…)の部分で何をしようとしているのかが分かりません。何か参考になるHPや考え方だけでも教えていただけないでしょうか。

  • プログラムの意味がわからなくて困っています

    こんにちは。以下のプログラムの意味がわからなくて困っています。分数q/p(p、qはともに正の整数)に関係するもので、3/13を入力したときの出力と、配列R()がどんな変化をしていくかを教えてください。 100 option base 0 110 dim A(1000) 120 dim R(999) 130 let N=1000 140 for I=0 to N-1 150 let R(I)=0 160 Next I 170 do 180 print"分母p="; 190 input P 200 if (P>N) then 210 print"分母は1000以下にしてください” 220 end if 230 loop while(P>N) 240 print"分子q="; 250 input Q 260 let A(0)=int(Q/P) 270 let Q=mod(Q,P) 280 let K=0 290 Do 300 let K=K+1 310 let R(Q)=K 320 let Q=Q*10 330 let A(K)=int(Q/P) 340 let Q=mod(Q,P) 350 loop while (R(Q)=0) 360 print A(0);"."; 370 for I=1 to R(Q)-1 380 print A(I); 390 next I 400 if (R(Q)<K) or (A(K)<>0) then 410 print "{"; 420 for I=R(Q) to K 430 print A(I); 440 next I 450 print"}"; 460 end if 470 end 100から160までで配列Aを1000個、配列Rを999個準備し、配列Rの中身を0にしている。 170から230で分母Pに13を入れ分母が1000以下になることを確認している。1000以上であれば、1000以下になるまでループ内を繰り返す。 240以下で分子を入れているようですが、ここからよくわからなくなってしまいました。 よろしくお願いします。  

  • Excel 「0x」、「h」 付き 16進変換

    【Excel 2002 SP3】 を使用しております。 A1セル:"0xFFFFh" B1セル:"0x55h" C1セル:"0xAAh" D1セル:"0x0000h" 上記データが各セル書き込まれています。 上記値を10進に変換したいのですが、 A2セル:"=HEX2DEC("A1")" B2セル:"=HEX2DEC("B1")" C2セル:"=HEX2DEC("C1")" D2セル:"=HEX2DEC("D1")" 上記では10進変換できませんでした。 "0x","h"が原因だとわかっているのですが、 どちらも付加したまま10進変換できればと考えています。 VBAで文字解析するれば対応できそうでしたが、 VBAを使わず、Cellの式だけで実現したいと考えています。 何かよい方法はないでしょうか?

専門家に質問してみよう