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

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

numenc 受取先変数, 対象データ, 変換後の基数
受取先変数10進数から変換した値の受取先変数を指定する。
対象データ変換前の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
#module
#deffunc numenc val, int, int
	mref rstr, 24 : mref integer, 1 : mref no, 2
	rstr = ""
	if (no < 2) || (no > 36) : return // 基数の下限・上限トラップ(念の為)
	if integer < 0 : minus = 1 : else : minus = 0
	if minus : syou = integer * -1 : else : syou = integer
	tmp = ""
	repeat
		poke tmp, , (syou \ no > 9) * 7 + (syou \ no) + 48 // 10以上はアルファベットを使用
		rstr = tmp + "" + rstr
		syou = syou / no
		if syou = 0 : break // 0になったら終了
	loop
	if minus : rstr = "-" + rstr
	return
#global

	// 準備
	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, , , 6
	pos 100,  10 : mes "10進数 →"
	pos 220,  10 : combox cardinal, 100, cno
	pos 320,  10 : button "変換", *change
	objsel 0
	stop

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

受取先 = numenc(対象データ, 変換後の基数)
受取先10進数から変換した値の受取先を指定する。
対象データ変換前の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
#module
#defcfunc numenc int integer, int no, local rstr, local minus, local tmp, local syou
	rstr = ""
	if (no < 2) || (no > 36) : return rstr // 基数の下限・上限トラップ(念の為)
	if integer < 0 : minus = 1
	if minus : syou = integer * -1 : else : syou = integer
	tmp = ""
	repeat
		poke tmp, , (syou \ no > 9) * 7 + (syou \ no) + 48 // 10以上はアルファベットを使用
		rstr = tmp + "" + rstr
		syou /= no
		if syou = 0 : break // 0になったら終了
	loop
	if minus : rstr = "-" + rstr
	return rstr
#global

	// 準備
	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 : mes "10進数 →"
	pos 220,  10 : combox cardinal, 100, cno
	pos 320,  10 : button gosub "変換", *change
	stop

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