〜 ナンバー 〜
任意の基数(2〜36進数)から10進数に変換

標準命令に10から16進数に変換する命令(16から10進数も命令1つで可能)がありますが、
他の基数に変換する命令は用意されていません。
しかし、変換アルゴリズムは理解してしまえば非常に単純なもので、
HSPに存在する命令を組み合わせることで何進数でも自分で実装出来ます。
事実、下記モジュールを利用すると、2〜36進数値のいずれかを10進数に変換することが出来ます。
当然のことながら、変換する値が何進数なのかを把握しておき、変換時に元の基数を指定する必要があります。
コチラの10進数から別の基数に変換する命令・関数で変換した後に、
元の10進数に戻したい場合や、10進数以外の基数から、別の基数に直接変換したい場合は、
組み合わせることで実現できます。
尚、サンプルモジュールでは最大で36進数としていますが、1バイトで最大256種類扱えますから、
「このコードは10進数の○とする」とルール付けすれば、応用次第で256進数まで扱えることでしょう。
あと、モジュール内ではオーバーチェックを行っていません。
例えば、2進数ではありえない5を指定したり、10進数なのにFを用いると、
何進数だろうが、2は2として、Fは15として、計算に使用しますので、
1桁だけの場合は正常に行きますが、2桁以上になると係数(重み)が変換対象の基数を用いますので、
正常に計算されなくなります。
処理せずエラーとしたい場合はモジュール命令を使用する前のプログラムでトラップを設けましょう。
	

numdec 受取先変数, 対象データ, 元の基数
受取先変数10進数に変換した値の受取先変数を指定する。
対象データ変換前の値(文字列型)を指定する。
元の基数変換元の基数(2〜36)を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#module
#deffunc numdec val, str, int
	mref stt, 16 : mref string, 33 : mref no, 2
	stt = 0
	if (no < 2) || (no > 36) : return // 基数の下限・上限トラップ(念の為)
	s = string
	strlen len, s
	minus = 0
	tmp = 0
	peek tmp, s
	if tmp = '-' {
		minus = 1
		len--
		strmid s, s, 1, len
	}
	omomi = 1
	repeat len, 1
		peek tmp, s, len - cnt
		tmp -= ((tmp >= 'A') * 7 + 48) // アルファベットAは10
		stt += tmp * omomi
		omomi = omomi * no
	loop
	if minus : stt = stt * -1
	return
#global

	// 準備
	sdim number, 8 : sdim cno, 280
	number = "12345"
	cardinal = 8 // 0番目が2進数であるため、10進数は8
	repeat 35, 2
		if cno ! "" : cno += "\n"
		cno += "" + cnt + "進数"
	loop
	// 配置
	objsize 80, 25
	pos  10,  10 : input number, , , 7
	pos 100,  10 : combox cardinal, 100, cno
	pos 200,  12 : mes "→ 10進数"
	pos 320,  10 : button "変換", *change
	stop

*change
	redraw 0
	color 255, 255,255 : boxf 0, 40 : color 255
	before = cardinal + 2
	numdec data, number, before
	pos  10,  40 : mes number + "(" + before + ")"
	pos  20,  70 : mes "↓"
	pos  10, 100 : mes "" + data + "(10)" // 目的の基数に変換
	redraw
	stop

受取先 = numdec(対象データ, 元の基数)
受取先10進数に変換した値の受取先を指定する。
対象データ変換前の値(文字列型)を指定する。
元の基数変換元の基数(2〜36)を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#module
#defcfunc numdec str string, int no, local stt, local s, local minus, local omomi, local tmp
	stt = 0
	if (no < 2) || (no > 36) : return stt // 基数の下限・上限トラップ(念の為)
	s = string
	if peek(s) = '-' : minus = 1 : s = strmid(s, 1, strlen(s) - 1) : else : minus = 0
	omomi = 1
	repeat strlen(s), 1
		tmp = peek(s, strlen(s) - cnt) - (peek(s, strlen(s) - cnt) >= 'A') * 7 - 48 // アルファベットAは10
		stt += tmp * omomi
		omomi *= no
	loop
	if minus : stt *= -1
	return stt
#global

	// 準備
	sdim number, 8 : sdim cno, 280
	number = "12345"
	cardinal = 8 // 0番目が2進数であるため、10進数は8
	repeat 35, 2
		if cno ! "" : cno += "\n"
		cno += str(cnt) + "進数"
	loop
	// 配置
	objsize 80, 20
	pos  10,  10 : input number, , , 6
	pos 100,  10 : combox cardinal, 100, cno
	pos 200,  12 : mes "→ 10進数"
	pos 320,  10 : button gosub "変換", *change
	stop

*change
	redraw 0
	color 255, 255,255 : boxf 0, 40 : color 255
	pos  10,  40 : mes "" + number + "(" + (cardinal + 2) + ")"
	pos  20,  70 : mes "↓"
	pos  10, 100 : mes "" + numdec(number, cardinal + 2) + "(10)" // 目的の基数に変換
	redraw
	return