int bitbuf_get_1_cnt(byte4 *p,int n)
{
int cnt=0,i;
for(i=0;i>5;//j=i/32;
k=i&0x1F;//k=i-j*32;
if(gbi(p[j],k)==0)
{
sbi(p[j],k);
return 1;
}
}
return 0;
}
int bitbuf_cbi(byte4 *p,int n,int i)
{
int j,k;
if(0<=i)if(i<(n*32))
{
j=i>>5;//j=i/32;
k=i&0x1F;//k=i-j*32;
if(gbi(p[j],k))
{
cbi(p[j],k);
return 1;
}
}
return 0;
}
int bitbuf_gbi(byte4 *p,int n,int i)
{
int j,k;
if(0<=i)if(i<(n*32))
{
j=i>>5;//j=i/32;
k=i&0x1F;//k=i-j*32;
return gbi(p[j],k);
}
return 0;
}
int bitbuf_next1_loop(byte4 *pArray,int n,int i)//i부터, 다음 '1'비트의 인덱스 찾기.ret=-1(not found)
{
int size,m=32*n;
size=m;
if(i<0)i=0;
while(m)
{
m--;
if(i>=size)i=0;
if(bitbuf_gbi(pArray,n,i))
{
return i;
}
i++;
}
return -1;
}
#ifdef _DEBUG
void DEBUG_bitbuf_next1_loop_test()
{
byte4 a[2];int n=countof(a),i,m=sizeof(a)*8;
//----------------
a[0]=0;
a[1]=0;
i=bitbuf_next1_loop(a,n,-1);
DEBUG_if_err(i!=-1);
i=bitbuf_next1_loop(a,n,0);
DEBUG_if_err(i!=-1);
i=bitbuf_next1_loop(a,n,1);
DEBUG_if_err(i!=-1);
i=bitbuf_next1_loop(a,n,m);
DEBUG_if_err(i!=-1);
i=bitbuf_next1_loop(a,n,m+1);
DEBUG_if_err(i!=-1);
//----------------
a[0]=1;
a[1]=0;
i=bitbuf_next1_loop(a,n,-1);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,0);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,1);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,m);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,m+4);
DEBUG_if_err(i!=0);
//----------------
a[0]=1<<5;
a[1]=0;
i=bitbuf_next1_loop(a,n,-1);
DEBUG_if_err(i!=5);
i=bitbuf_next1_loop(a,n,0);
DEBUG_if_err(i!=5);
i=bitbuf_next1_loop(a,n,1);
DEBUG_if_err(i!=5);
i=bitbuf_next1_loop(a,n,m);
DEBUG_if_err(i!=5);
i=bitbuf_next1_loop(a,n,m+4);
DEBUG_if_err(i!=5);
//----------------
a[0]=0;
a[1]=1;
i=bitbuf_next1_loop(a,n,-1);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,0);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,1);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,m);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,m+1);
DEBUG_if_err(i!=32);
//----------------
a[0]=0;
a[1]=1<<31;
i=bitbuf_next1_loop(a,n,-1);
DEBUG_if_err(i!=63);
i=bitbuf_next1_loop(a,n,0);
DEBUG_if_err(i!=63);
i=bitbuf_next1_loop(a,n,1);
DEBUG_if_err(i!=63);
i=bitbuf_next1_loop(a,n,m);
DEBUG_if_err(i!=63);
i=bitbuf_next1_loop(a,n,m+1);
DEBUG_if_err(i!=63);
//----------------
a[0]=0;
a[1]=1<<3;
i=bitbuf_next1_loop(a,n,-1);
DEBUG_if_err(i!=35);
i=bitbuf_next1_loop(a,n,0);
DEBUG_if_err(i!=35);
i=bitbuf_next1_loop(a,n,2);
DEBUG_if_err(i!=35);
i=bitbuf_next1_loop(a,n,m);
DEBUG_if_err(i!=35);
i=bitbuf_next1_loop(a,n,m+1);
DEBUG_if_err(i!=35);
//----------------
//----------------
a[0]=1;
a[1]=1;
i=bitbuf_next1_loop(a,n,-1);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,0);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,1);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,m);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,m+1);
DEBUG_if_err(i!=0);
//----------------
a[0]=0x11;
a[1]=0x11;
i=3;
i=bitbuf_next1_loop(a,n,i);
DEBUG_if_err(i!=4);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=36);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=4);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=36);
//----------------
a[0]=0x11;
a[1]=0;
i=10;
i=bitbuf_next1_loop(a,n,i);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=4);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=4);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=0);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=4);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=0);
//----------------
a[0]=0;
a[1]=0x11;
i=17;
i=bitbuf_next1_loop(a,n,i);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=36);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=36);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=32);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=36);
i=bitbuf_next1_loop(a,n,i+1);
DEBUG_if_err(i!=32);
//----------------
}
#endif