FILE名:FILE_set_get_bit.hsp
・以下テストコード
参考までにリファクタリング前のスクリプト
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
// 数値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))) |