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))) |