unsigned char flags[1000];
int getv(int idx)
{
int i=idx>>3;
int j=idx&0x7;
//return ((flags[i]&(0x1<<j))>>j);
return ((flags[i]>>j)&0x01);
}
int setv(int idx)
{
int i=idx>>3;
int j=idx&0x07;
flags[i]|=(0x01<<j);
}
unsigned get_val(int idx)
{
int i = idx/4;
int j = idx%4;
unsigned ret = (flags[i]&(0x3<<(2*j)))>>(2*j);
return ret;
}
unsigned set_val(int idx, unsigned int val)
{
int i = idx/4;
int j = idx%4;
//unsigned tmp = (flags[i]&~((0x3<<(2*j))&0xff)) | (((val%4)<<(2*j))&0xff);
flags[i] = (flags[i]&~(0x3<<(2*j)))|(val<<(2*j));
return 0;
}
unsigned add_one(int idx)
{
if (get_val(idx)>=2) {
return 1;
}
else {
set_val(idx, get_val(idx)+1);
return 0;
}
}
int a[]={1, 3, 5, 7, 9, 1, 3, 5, 7, 1, 3, 5,1, 3, 1,10,2,4,6,8,0};
int main()
{
int i,j;
memset(flags, 0, sizeof(flags));
/*
printf("原数组为:");
for(i=0;i < sizeof(a)/sizeof(int); ++i) {
printf("%d ", a[i]);
add_one(a[i]);
}
printf("\r\n");
printf("只出现过一次的数:");
for(i=0;i < 100; ++i) {
if(get_val(i) == 1)
printf("%d ", i);
}
*/
///*
for(i=0;i<sizeof(a)/sizeof(int);++i){
if(getv(a[i])==0)
setv(a[i]);
else
;
//cout<<a[i]<<" ";
}
//*/
for(i=0;i<2;i++)
for(j=0;j<8;j++){
if((flags[i]>>j)&0x01==1)
cout<<((i<<3)+j)<<" ";
}
printf("\r\n");
}