〜 スクリプト 〜
1つの数値変数に複数の情報を保存

普通の変数にしろ、配列変数にしろ、フラグ(スイッチ)用に1つの変数丸々使うと、
1つの情報を保持するのに4バイトも使ってしまいます(通常の整数型の場合)。
もし、数値型ではなく文字列型にすると、1つの情報は1バイトに抑えることが出来ます。
…が、HSPでは4の倍数サイズでしか確保が出来ないために、最低でも4バイト使用することになります。
また、文字列型の場合は、終端を示す制御文字NULLの1バイト分が必要なために、
数値型変数で丸々1つ行うよりかは多く扱えますが、4バイトで3つの情報しか保持できません。
もし、スイッチ用に0か1しか利用しないのであれば、ビットの考えを利用し、
4バイト(32ビット)の変数で、32種類の情報を扱うことが可能です。
HSP3に登場した実数型ならば8バイト(64ビット)なので、64種類を扱えます。
尚、例えば1つだけ0〜2まで使いたいという場合は、2ビット消費するので31種類に、
1つだけ0〜5まで使いたいという場合は、3ビット消費するので29種類に減ります。
下記サンプルは、32個のチェックボックスデータを読み書きするものです。
コチラに色要素8ビットの赤青緑分3つを詰め込むサンプルがあります。参考にどうぞ。
	
 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
53
54
55
56
57
58
#define NUM  32
#define FILE "hspbc_chkbox.txt"

	dim chk, NUM
	objsize 180, 25
	repeat NUM
		pos cnt \ 3 * 200 + 30, cnt / 3 * 40 + 20 : chkbox "チェック" + cnt, chk.cnt
	loop
	objsize 60, 25
	pos 430, 420 : button "クリア", *clear
	pos 490, 420 : button "読込", *load
	pos 550, 420 : button "保存", *save
	stop

*clear
	repeat NUM
		objprm cnt, 0
	loop
	stop

*load
	exist FILE
	if strsize < 0 : stop
	data = ""
	tmp = 0
	// 1バイト分ずつ処理する
	repeat NUM / 8
		bload FILE, data, 1, cnt
		peek tmp, data
		cont = cnt
		// 1ビット分ずつ処理する
		repeat 8
			youso = cont * 8 + cnt     // 配列要素番号を求める
			chk.youso = tmp >> cnt & 1 // 指定ビット情報を格納
			objprm youso, chk.youso    // チェックボックスを更新
		loop
	loop
	stop

*save
	// 空でファイルの作成
	data = ""
	bsave FILE, data, 1
	// 1バイト分ずつ処理する
	repeat NUM / 8
		tmp = 0
		cont = cnt
		// 1ビットの情報を1バイト分集める
		repeat 8
			youso = cont * 8 + cnt
			tmp += chk.youso << cnt
		loop
		// 追記する
		poke data, 0, tmp
		bsave FILE, data, 1, cnt
	loop
	dialog "保存しました"
	stop
 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
53
54
55
56
#define NUM  32
#define FILE "hspbc_chkbox.txt"

	dim chk, NUM
	objsize 180, 25
	repeat NUM
		pos cnt \ 3 * 200 + 30, cnt / 3 * 40 + 20 : chkbox "チェック" + cnt, chk.cnt
	loop
	objsize 60, 25
	pos 430, 420 : button "クリア", *clear
	pos 490, 420 : button "読込", *load
	pos 550, 420 : button "保存", *save
	stop

*clear
	repeat NUM
		objprm cnt, 0
	loop
	stop

*load
	exist FILE
	if strsize < 0 : stop
	data = ""
	tmp = 0
	// 1バイト分ずつ処理する
	repeat NUM / 8
		bload FILE, data, 1, cnt
		tmp = peek(data)
		cont = cnt
		// 1ビット分ずつ処理する
		repeat 8
			chk(cont * 8 + cnt) = tmp >> cnt & 1       // 指定ビット情報を格納
			objprm cont * 8 + cnt, chk(cont * 8 + cnt) // チェックボックスを更新
		loop
	loop
	stop

*save
	// 空でファイルの作成
	data = ""
	bsave FILE, data, 1
	// 1バイト分ずつ処理する
	repeat NUM / 8
		tmp = 0
		cont = cnt
		// 1ビットの情報を1バイト分集める
		repeat 8
			tmp += chk(cont * 8 + cnt) << cnt
		loop
		// 追記する
		poke data, 0, tmp
		bsave FILE, data, 1, cnt
	loop
	dialog "保存しました"
	stop