新しく発言する  EXIT  インデックスへ

16進法


  16進法 マメ 2008/03/27 23:16:08 
  !10進レジスター:16進レジスターのよう... SECOND 2008/03/28 01:51:15 
  │└!エピソード SECOND 2008/03/28 18:04:07 
  │ └エピソード2 SECOND 2008/03/28 19:17:59 
  │  └!2進化10進数(BCD、Binary-codeddecimal)... 山中和義 2008/03/30 12:52:58 
  簡単なのは組込み関数のBSTR$を使うことです... 荒田浩二 2008/03/28 11:39:51  (修正1回)

  16進法 マメ 2008/03/27 23:16:08   ツリーへ
16進法  返事を書く  ノートメニュー
マメ <uvjqqpehve> 2008/03/27 23:16:08
10進法から2進法への変換プログラムは出来ましたが、
16進法に変換するプログラムが分かりません。教えて下さい。
宜しくお願いします。
  !10進レジスター:16進レジスターのよう... SECOND 2008/03/28 01:51:15   ツリーへ
Re: 16進法  返事を書く  ノートメニュー
SECOND <jjqdmekgpt> 2008/03/28 01:51:15
!10進レジスター:16進レジスター のように並べて
!右方向にシフトする(16で割る)方法です。

DIM hex(8) ! ←出力の最大桁

LET dec=100000 ! ←入力の unsigned 10進数

LET p=1
DO WHILE 16<=dec
LET hex(p)=MOD(dec,16)
LET dec=INT(dec/16)
LET p=p+1
LOOP
LET hex(p)=dec

! hex(p) 〜 hex(1)  ←出力の unsigned 16進数

FOR i=p TO 1 STEP -1
LET y=hex(i)
PRINT mid$( "0123456789ABCDEF", y+1 ,1 );
NEXT i

END
  │└!エピソード SECOND 2008/03/28 18:04:07   ツリーへ
Re: !10進レジスター:16進レジスターのよう...  返事を書く  ノートメニュー
SECOND <jjqdmekgpt> 2008/03/28 18:04:07
!エピソード

!任意のN進数へ・・・同じです。

!入力レジスター:N進レジスター のように並べて
!右方向にシフト(Nで割る)。

DIM hex(100) ! ←出力の最大桁

CALL place(100000,2) ! ← ( 入力のunsigned 数値,N進数)
CALL place(100000,3)
CALL place(100000,4)
CALL place(100000,5)
CALL place(100000,6)
CALL place(100000,7)
CALL place(100000,8)
CALL place(100000,9)
CALL place(100000,10)
CALL place(100000,11)
CALL place(100000,12)
CALL place(100000,13)
CALL place(100000,14)
CALL place(100000,15)
CALL place(100000,16)

SUB place( dec, N )
PRINT N;"進数: ";
!
LET p=1
DO WHILE N <=dec
LET hex(p)=MOD(dec,N)
LET dec=INT(dec/N)
LET p=p+1
LOOP
LET hex(p)=dec
!
! hex(p) 〜 hex(1)  ←出力の unsigned N進数
!
FOR i=p TO 1 STEP -1
LET y=hex(i)
PRINT mid$( "0123456789ABCDEF", y+1 ,1 );
NEXT i
PRINT
END SUB

END

!N進レジスター:10進レジスター のように並べて
!左方向にシフトする(10を乗ず)方法も、有ります。
!が、高級言語のBASICは、N進演算をしませんので、適しません。
  │ └エピソード2 SECOND 2008/03/28 19:17:59   ツリーへ
Re: !エピソード  返事を書く  ノートメニュー
SECOND <jjqdmekgpt> 2008/03/28 19:17:59
エピソード2

コンピュータ−・レジスター上での
2進数、4進数、8進、16進、…(2^N)進数は、同じものです。

 2進数:1011011101111010

    :10 11 01 11 01 11 10 10
 4進数: 2  3  1  3  1  3  2  2

    :1 011 011 101 111 010
 8進数:1   3   3   5   7   2

    :1011 0111 0111 1010
16進数:   B    7    7    A

2進レジスターしか無い、コンピュータ−・レジスターを、
読む人の側で、区切れを何処へ置くかの違いです。

コンピュータ−・レジスター上での10進数は、区切れの調整だけでは、できませんので、
BCD(Binary Coded Decimal) にします。

16進と同じ4ビット区切りですが、各区間は、0Ah(10d)以上の数を、使わないようにして、
0Ah(10d)以上は、上の4ビット区切りに、桁上がり(Carry)とします。

BCD :0001 1001 1000 0111
10進数:   1    9    8    7

これを、コンピュータ−・レジスターで、10進 →16進(2進)へ変換するには、
2進レジスター:BCDレジスター のように並べて左シフト(10倍)するのが便利です。

とくに小さいコンピューター(マイコン等)は、BCD割り算の出来ないものが殆んどなので、
右シフト(10で割る)の方は、不利で、2進加算だけで出来る左シフト(10倍)の方が有利
となります。

(1)BCDの10倍は、計算しないで、4ビットの左シフト。
(2)2進レジスターは、その4ビットを、右から受取って、左シフト(10倍)する。…2進演算で。

(1)(2)を繰返す。

※細かい事をいうと、(2)は、既存を10倍してから、BCDからの4ビットを加算して受取る。
  │  └!2進化10進数(BCD、Binary-codeddecimal)... 山中和義 2008/03/30 12:52:58   ツリーへ
Re: エピソード2  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/03/30 12:52:58
!2進化10進数(BCD、Binary-coded decimal)の変換

FUNCTION BCDtoBIN(a) !非負の数aをBCD表記して、2進法とみなした値
LET BCDtoBIN=BVAL(STR$(a),16)
END FUNCTION
FUNCTION BINtoBCD(a) !非負の数aの2進法を、BCD表記の数とみなした値
LET t$=BSTR$(a,2)
LET L=LEN(t$) !桁を得る
LET m=MOD(L,4) !4桁ごとに区切る
IF m>0 THEN !先頭部分
LET s=BVAL(t$(1:m),2)
LET t$(1:m)="" !eat it
ELSE
LET s=0
END IF
FOR i=1 TO INT(L/4) !残り
LET s=s*10+BVAL(t$(1:4),2) !左シフト
LET t$(1:4)="" !eat it
NEXT i
LET BINtoBCD=s
END FUNCTION


LET a=49
PRINT BCDtoBIN(a)
LET a=97
PRINT BCDtoBIN(a)
LET a=1987
PRINT BCDtoBIN(a),BVAL("0001100110000111",2)


LET a=73
PRINT BINtoBCD(a)
LET a=151
PRINT BINtoBCD(a)
LET a=6535
PRINT BINtoBCD(a), BINtoBCD(BVAL("0001100110000111",2))

END
  簡単なのは組込み関数のBSTR$を使うことです... 荒田浩二 2008/03/28 11:39:51  (修正1回)  ツリーへ
Re: 16進法  返事を書く  ノートメニュー
荒田浩二 <knrztrhoel> 2008/03/28 11:39:51 ** この記事は1回修正されてます
簡単なのは組込み関数のBSTR$を使うことです。

10 INPUT n ! 非負の10進整数
20 PRINT BSTR$(n,16)
30 END


組込み関数を使わない方法としては、
すでに10進法から2進法への変換プログラムが完成しているのであれば、そこから16進法へ変換できます。

REM ** 2進法を16進法に変換(b$→h$) **
INPUT n ! 非負の10進整数
LET b$=BSTR$(n,2) ! この部分はオリジナルのプログラムでどうぞ
PRINT b$ ! 2進法文字列
DECLARE FUNCTION convert$
LET m=MOD(LEN(b$),4)
IF m<>0 THEN LET h$=convert$(b$(1:m)) ! 上位m桁
FOR i=0 TO INT(LEN(b$)/4)-1 ! 4桁ずつ変換
LET h$=h$ & convert$(b$(m+4*i+1:m+4*i+4))
NEXT i
PRINT h$ ! 16進法文字列
PRINT BVAL(h$,16) ! 組込み関数で検証
FUNCTION convert$(x$) ! 2進法4桁を16進法1桁に変換
LET a=0
FOR j=1 TO LEN(x$)
LET a=a+VAL(x$(j:j))*2^(LEN(x$)-j)
NEXT j
IF a>=10 THEN LET convert$=CHR$(a+55) ELSE LET convert$=STR$(a)
END FUNCTION
END



 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。