FILE名:FILE_set_get_bit.hsp
#module set_get_bit
//	0〜65535を2進数の文字列に変換
#defcfunc local ret_bit int p
s="":t=""
a=1:b=0
repeat 16
b=(p/a)\2
t=str(b)+s
s=t
a*=2
loop
return s
//	2のnum乗を返す
#defcfunc local many_times_2mul int num
a=1
repeat num
a*=2
loop
return a
//	数値pのnum番目のbitを取得する
#defcfunc local one_bit_get int p,int num
if num>16{
logmes "one_bit_get内のerror"
logmes "numが大きすぎます。num:"+num
}
if 0>=num{
logmes "one_bit_get内のerror"
logmes "numが小さすぎます。num:"+num
}
sc=0
//	to_addは2のx乗
to_add=many_times_2mul@set_get_bit(num-1)
//	scにto_addを足すとnum番目だけ1になる
sc+=to_add
//	num番目だけ1の値とand
r=p&sc
if r==0{
return 0
}else{
//		どこかのbitが1なので1を返す
return 1
}
return -1
//	数値p1のnum番目のbitに1をsetする
#defcfunc local one_bit_set_1 int p1,int num
sc=0
//		to_addは2のx乗
to_add=many_times_2mul@set_get_bit(num-1)
//		scにto_addを足すとnum番目だけ1になる
sc+=to_add
//		num番目だけ1の値と|
return p1|sc
//	数値p1のnum番目のbitに0をsetする
#defcfunc local one_bit_set_0 int p1,int num
//		scは2進数の各桁が全部1
sc=256*256-1
//		to_subは2のx乗
to_sub=many_times_2mul@set_get_bit(num-1)
//		scからto_subを引くとnum番目だけ0になる
sc-=to_sub
//		num番目だけ0の値と&
return p1&sc
//	数値p1のp_n番目のbitにbit(引数)をsetする
#defcfunc local one_bit_set int p,int p_n,int bit
if p_n>16{
logmes "one_bit_set内のerror"
logmes "numが大きすぎます。num:"+num
}
if 0>=p_n{
logmes "one_bit_set内のerror"
logmes "numが小さすぎます。num:"+num
}
if bit==1|bit==0{
if bit==1{
return one_bit_set_1@set_get_bit(p,p_n)
}else{
if bit==0{
return one_bit_set_0@set_get_bit(p,p_n)
}
}
}else{
logmes "one_bit_set内のerror"
logmes "bitの値は1か0にしてください"
return-1
}
#global

・以下テストコード
#include "FILE_set_get_bit.hsp"
#define ret_bit ret_bit@set_get_bit
#define one_bit_set one_bit_set@set_get_bit
#define one_bit_get one_bit_get@set_get_bit
//	ret_bitのTEST
repeat 16
mes ret_bit(cnt)
loop
//	指定のbitに1を代入するTEST
l=256*256-1
logmes str(ret_bit(one_bit_set(l,1,0)))
logmes str(ret_bit(one_bit_set(l,2,0)))
logmes str(ret_bit(one_bit_set(l,3,0)))
logmes str(ret_bit(one_bit_set(l,4,0)))
logmes str(ret_bit(one_bit_set(l,5,0)))
logmes str(ret_bit(one_bit_set(l,6,0)))
logmes str(ret_bit(one_bit_set(l,7,0)))
logmes str(ret_bit(one_bit_set(l,8,0)))
logmes str(ret_bit(one_bit_set(l,9,0)))
logmes str(ret_bit(one_bit_set(l,10,0)))
logmes str(ret_bit(one_bit_set(l,11,0)))
logmes str(ret_bit(one_bit_set(l,12,0)))
logmes str(ret_bit(one_bit_set(l,13,0)))
logmes str(ret_bit(one_bit_set(l,14,0)))
logmes str(ret_bit(one_bit_set(l,15,0)))
logmes str(ret_bit(one_bit_set(l,16,0)))
/* 実行結果A
1111111111111110
1111111111111101
1111111111111011
1111111111110111
1111111111101111
1111111111011111
1111111110111111
1111111101111111
1111111011111111
1111110111111111
1111101111111111
1111011111111111
1110111111111111
1101111111111111
1011111111111111
0111111111111111*/
//	指定のbitに0を代入するTEST
l=0
logmes str(ret_bit(one_bit_set(l,1,1)))
logmes str(ret_bit(one_bit_set(l,2,1)))
logmes str(ret_bit(one_bit_set(l,3,1)))
logmes str(ret_bit(one_bit_set(l,4,1)))
logmes str(ret_bit(one_bit_set(l,5,1)))
logmes str(ret_bit(one_bit_set(l,6,1)))
logmes str(ret_bit(one_bit_set(l,7,1)))
logmes str(ret_bit(one_bit_set(l,8,1)))
logmes str(ret_bit(one_bit_set(l,9,1)))
logmes str(ret_bit(one_bit_set(l,10,1)))
logmes str(ret_bit(one_bit_set(l,11,1)))
logmes str(ret_bit(one_bit_set(l,12,1)))
logmes str(ret_bit(one_bit_set(l,13,1)))
logmes str(ret_bit(one_bit_set(l,14,1)))
logmes str(ret_bit(one_bit_set(l,15,1)))
logmes str(ret_bit(one_bit_set(l,16,1)))
/* 実行結果B
0000000000000001
0000000000000010
0000000000000100
0000000000001000
0000000000010000
0000000000100000
0000000001000000
0000000010000000
0000000100000000
0000001000000000
0000010000000000
0000100000000000
0001000000000000
0010000000000000
0100000000000000
1000000000000000*/
l=256*256-1
//	各bitを取得するTEST。取得するのは0
n=one_bit_set(l,1,0):logmes str(one_bit_get(n,1))
n=one_bit_set(l,2,0):logmes str(one_bit_get(n,2))
n=one_bit_set(l,3,0):logmes str(one_bit_get(n,3))
n=one_bit_set(l,4,0):logmes str(one_bit_get(n,4))
n=one_bit_set(l,5,0):logmes str(one_bit_get(n,5))
n=one_bit_set(l,6,0):logmes str(one_bit_get(n,6))
n=one_bit_set(l,7,0):logmes str(one_bit_get(n,7))
n=one_bit_set(l,8,0):logmes str(one_bit_get(n,8))
n=one_bit_set(l,9,0):logmes str(one_bit_get(n,9))
n=one_bit_set(l,10,0):logmes str(one_bit_get(n,10))
n=one_bit_set(l,11,0):logmes str(one_bit_get(n,11))
n=one_bit_set(l,12,0):logmes str(one_bit_get(n,12))
n=one_bit_set(l,13,0):logmes str(one_bit_get(n,13))
n=one_bit_set(l,14,0):logmes str(one_bit_get(n,14))
n=one_bit_set(l,15,0):logmes str(one_bit_get(n,15))
n=one_bit_set(l,16,0):logmes str(one_bit_get(n,16))
/*実行結果C
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0*/
l=0
//	各bitを取得するTEST。取得するのは1
n=one_bit_set(l,1,1):logmes str(one_bit_get(n,1))
n=one_bit_set(l,2,1):logmes str(one_bit_get(n,2))
n=one_bit_set(l,3,1):logmes str(one_bit_get(n,3))
n=one_bit_set(l,4,1):logmes str(one_bit_get(n,4))
n=one_bit_set(l,5,1):logmes str(one_bit_get(n,5))
n=one_bit_set(l,6,1):logmes str(one_bit_get(n,6))
n=one_bit_set(l,7,1):logmes str(one_bit_get(n,7))
n=one_bit_set(l,8,1):logmes str(one_bit_get(n,8))
n=one_bit_set(l,9,1):logmes str(one_bit_get(n,9))
n=one_bit_set(l,10,1):logmes str(one_bit_get(n,10))
n=one_bit_set(l,11,1):logmes str(one_bit_get(n,11))
n=one_bit_set(l,12,1):logmes str(one_bit_get(n,12))
n=one_bit_set(l,13,1):logmes str(one_bit_get(n,13))
n=one_bit_set(l,14,1):logmes str(one_bit_get(n,14))
n=one_bit_set(l,15,1):logmes str(one_bit_get(n,15))
n=one_bit_set(l,16,1):logmes str(one_bit_get(n,16))
/*実行結果D
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1*/
参考までにリファクタリング前のスクリプト
bit演算しないでやるバージョン
#module set_get_bit
//	0〜65535を2進数の文字列に変換
#defcfunc local ret_bit int p
s="":t=""
a=1:b=0
repeat 16
b=(p/a)\2
t=str(b)+s
s=t
a*=2
loop
return s
//	2のnum乗を返す
#defcfunc local many_times_2mul int num
a=1
repeat num
a*=2
loop
return a
//	指定(num)番目のbitに1か0を代入
//	p1:演算する数字
//	num:代入する番目
//	代入する値。1か0
#defcfunc local one_bit_set_b int p1,int num,int bit
if num>16{
logmes "one_bit_set内のerror"
logmes "numが大きすぎます。num:"+num
}
if 0>=num{
logmes "one_bit_set内のerror"
logmes "numが小さすぎます。num:"+num
}
i=num-1
//	数字を割る値。2の倍数
to_div_b=2*many_times_2mul@set_get_bit(i)
//	数字を剰余する値。2の倍数
surplus_b=many_times_2mul@set_get_bit(i)

a=p1/to_div_b
b=p1\surplus_b

//	指定のbitより桁の多いbit用
mul2a_b=to_div_b
//	指定のbit用
mul2bit_b=surplus_b

return a*mul2a_b+bit*mul2bit_b+b
#defcfunc local one_bit_set_1 int p1,int num
i=num-1
//	数字を割る値。2の倍数
to_div_b=2*many_times_2mul@set_get_bit(i)
//	数字を剰余する値。2の倍数
surplus_b=many_times_2mul@set_get_bit(i)

a=p1/to_div_b
b=p1\surplus_b

//	指定のbitより桁の多いbit用
mul2a_b=to_div_b
//	指定のbit用
mul2bit_b=surplus_b

return a*mul2a_b+1*mul2bit_b+b
#defcfunc local one_bit_set_0 int p1,int num
i=num-1
//	数字を割る値。2の倍数
to_div_b=2*many_times_2mul@set_get_bit(i)
//	数字を剰余する値。2の倍数
surplus_b=many_times_2mul@set_get_bit(i)

a=p1/to_div_b
b=p1\surplus_b

//	指定のbitより桁の多いbit用
mul2a_b=to_div_b

return a*mul2a_b+b
#defcfunc local one_bit_set int p,int p_n,int bit
if p_n>16{
logmes "one_bit_set内のerror"
logmes "numが大きすぎます。num:"+num
}
if 0>=p_n{
logmes "one_bit_set内のerror"
logmes "numが小さすぎます。num:"+num
}
if bit==1|bit==0{
if bit==1{
return one_bit_set_1@set_get_bit(p,p_n)
}else{
if bit==0{
return one_bit_set_0@set_get_bit(p,p_n)
}
}
}else{
logmes "one_bit_set内のerror"
logmes "bitの値は1か0にしてください"
return-1
}
#global
#define ret_bit ret_bit@set_get_bit
#define one_bit_set one_bit_set@set_get_bit
//	ret_bitのTEST
repeat 16
mes ret_bit(cnt)
loop
//	指定のbitに1を代入するTEST
l=256*256-1
logmes str(ret_bit(one_bit_set(l,1,0)))
logmes str(ret_bit(one_bit_set(l,2,0)))
logmes str(ret_bit(one_bit_set(l,3,0)))
logmes str(ret_bit(one_bit_set(l,4,0)))
logmes str(ret_bit(one_bit_set(l,5,0)))
logmes str(ret_bit(one_bit_set(l,6,0)))
logmes str(ret_bit(one_bit_set(l,7,0)))
logmes str(ret_bit(one_bit_set(l,8,0)))
logmes str(ret_bit(one_bit_set(l,9,0)))
logmes str(ret_bit(one_bit_set(l,10,0)))
logmes str(ret_bit(one_bit_set(l,11,0)))
logmes str(ret_bit(one_bit_set(l,12,0)))
logmes str(ret_bit(one_bit_set(l,13,0)))
logmes str(ret_bit(one_bit_set(l,14,0)))
logmes str(ret_bit(one_bit_set(l,15,0)))
logmes str(ret_bit(one_bit_set(l,16,0)))
//	指定のbitに0を代入するTEST
l=0
logmes str(ret_bit(one_bit_set(l,1,1)))
logmes str(ret_bit(one_bit_set(l,2,1)))
logmes str(ret_bit(one_bit_set(l,3,1)))
logmes str(ret_bit(one_bit_set(l,4,1)))
logmes str(ret_bit(one_bit_set(l,5,1)))
logmes str(ret_bit(one_bit_set(l,6,1)))
logmes str(ret_bit(one_bit_set(l,7,1)))
logmes str(ret_bit(one_bit_set(l,8,1)))
logmes str(ret_bit(one_bit_set(l,9,1)))
logmes str(ret_bit(one_bit_set(l,10,1)))
logmes str(ret_bit(one_bit_set(l,11,1)))
logmes str(ret_bit(one_bit_set(l,12,1)))
logmes str(ret_bit(one_bit_set(l,13,1)))
logmes str(ret_bit(one_bit_set(l,14,1)))
logmes str(ret_bit(one_bit_set(l,15,1)))
logmes str(ret_bit(one_bit_set(l,16,1)))