⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitset.cc

📁 早期freebsd实现
💻 CC
📖 第 1 页 / 共 2 页
字号:
    *s |= m1 & m2;  else  {    *s++ |= m1;    unsigned short* top = &(rep->s[index2]);    *top |= m2;    while (s < top)      *s++ = ONES;  }}void BitSet::clear(int from, int to){  if (from < 0 || from > to) error("Illegal bit index");  int index1 = BitSet_index(from);  int pos1   = BitSet_pos(from);    if (!rep->virt && index1 >= rep->len)    return;  int index2 = BitSet_index(to);  int pos2   = BitSet_pos(to);  if (index2 >= rep->len)    rep = BitSetresize(rep, index2+1);  unsigned short* s = &(rep->s[index1]);  unsigned short m1 = lmask(pos1);  unsigned short m2 = rmask(pos2);  if (index2 == index1)    *s &= ~(m1 & m2);  else  {    *s++ &= ~m1;    unsigned short* top = &(rep->s[index2]);    *top &= ~m2;    while (s < top)      *s++ = 0;  }}void BitSet::invert(int from, int to){  if (from < 0 || from > to) error("Illegal bit index");  int index1 = BitSet_index(from);  int pos1   = BitSet_pos(from);  int index2 = BitSet_index(to);  int pos2   = BitSet_pos(to);  if (index2 >= rep->len)    rep = BitSetresize(rep, index2+1);  unsigned short* s = &(rep->s[index1]);  unsigned short m1 = lmask(pos1);  unsigned short m2 = rmask(pos2);  if (index2 == index1)    *s ^= m1 & m2;  else  {    *s++ ^= m1;    unsigned short* top = &(rep->s[index2]);    *top ^= m2;    while (s < top)    {      unsigned short cmp = ~(*s);      *s++ = cmp;    }  }}int BitSet::test(int from, int to) const{  if (from < 0 || from > to) return 0;  int index1 = BitSet_index(from);  int pos1   = BitSet_pos(from);    if (index1 >= rep->len)    return rep->virt;  int index2 = BitSet_index(to);  int pos2   = BitSet_pos(to);  if (index2 >= rep->len)  {    if (rep->virt)      return 1;    else     {      index2 = rep->len - 1;      pos2 = BITSETBITS - 1;    }  }  unsigned short* s = &(rep->s[index1]);  unsigned short m1 = lmask(pos1);  unsigned short m2 = rmask(pos2);  if (index2 == index1)    return (*s & m1 & m2) != 0;  else  {    if (*s++ & m1)      return 1;    unsigned short* top = &(rep->s[index2]);    if (*top & m2)      return 1;    while (s < top)      if (*s++ != 0)         return 1;    return 0;  }}int BitSet::next(int p, int b) const{  ++p;  int index = BitSet_index(p);  int pos   = BitSet_pos(p);  int l = rep->len;    if (index >= l)  {    if (rep->virt == b)      return p;    else      return -1;  }  int j = index;  unsigned short* s = rep->s;  unsigned short a = s[j] >> pos;  int i = pos;  if (b == 1)  {    for (; i < BITSETBITS && a != 0; ++i)    {      if (a & 1)        return j * BITSETBITS + i;      a >>= 1;    }    for (++j; j < l; ++j)    {      a = s[j];      for (i = 0; i < BITSETBITS && a != 0; ++i)      {        if (a & 1)          return j * BITSETBITS + i;        a >>= 1;      }    }    if (rep->virt)      return j * BITSETBITS;    else      return -1;  }  else  {    for (; i < BITSETBITS; ++i)    {      if ((a & 1) == 0)        return j * BITSETBITS + i;      a >>= 1;    }    for (++j; j < l; ++j)    {      a = s[j];      if (a != ONES)      {        for (i = 0; i < BITSETBITS; ++i)        {          if ((a & 1) == 0)            return j * BITSETBITS + i;          a >>= 1;        }      }    }    if (!rep->virt)      return j * BITSETBITS;    else      return -1;  }}int BitSet::previous(int p, int b) const{  if (--p < 0)    return -1;  int index = BitSet_index(p);  int pos   = BitSet_pos(p);  unsigned short* s = rep->s;  int l = rep->len;  if (index >= l)  {    if (rep->virt == b)      return p;    else    {      index = l - 1;      pos = BITSETBITS - 1;    }  }  int j = index;  unsigned short a = s[j];  int i = pos;  unsigned short maxbit = 1 << pos;  if (b == 1)  {    for (; i >= 0 && a != 0; --i)    {      if (a & maxbit)        return j * BITSETBITS + i;      a <<= 1;    }    maxbit = 1 << (BITSETBITS - 1);    for (--j; j >= 0; --j)    {      a = s[j];      for (i = BITSETBITS - 1; i >= 0 && a != 0; --i)      {        if (a & maxbit)          return j * BITSETBITS + i;        a <<= 1;      }    }    return -1;  }  else  {    if (a != ONES)    {      for (; i >= 0; --i)      {        if ((a & maxbit) == 0)          return j * BITSETBITS + i;        a <<= 1;      }    }    maxbit = 1 << (BITSETBITS - 1);    for (--j; j >= 0; --j)    {      a = s[j];      if (a != ONES)      {        for (i = BITSETBITS - 1; i >= 0; --i)        {          if ((a & maxbit) == 0)            return j * BITSETBITS + i;          a <<= 1;        }      }    }    return -1;  }}int BitSet::last(int b) const{  if (b == rep->virt)    return -1;  else    return previous((rep->len) * BITSETBITS, b);}extern AllocRing _libgxx_fmtq;const char* BitSettoa(const BitSet& x, char f, char t, char star){  trim(x.rep);  int wrksiz = (x.rep->len + 1) * BITSETBITS + 2;  char* fmtbase = (char *) _libgxx_fmtq.alloc(wrksiz);  ostrstream stream(fmtbase, wrksiz);    x.printon(stream, f, t, star);  stream << ends;  return fmtbase;}#if defined(__GNUG__) && !defined(NO_NRV)BitSet shorttoBitSet(unsigned short w) return r{  r.rep = BitSetalloc(0, &w, 1, 0, 2);  trim(r.rep);}BitSet longtoBitSet(unsigned long w) return r;{  unsigned short u[2];  u[0] = w & ((unsigned short)(~(0)));  u[1] = w >> BITSETBITS;  r.rep = BitSetalloc(0, &u[0], 2, 0, 3);  trim(r.rep);}BitSet atoBitSet(const char* s, char f, char t, char star) return r{  int sl = strlen(s);  if (sl != 0)  {    r.rep = BitSetresize(r.rep, sl / BITSETBITS + 1);    unsigned short* rs = r.rep->s;    unsigned short a = 0;    unsigned short m = 1;    char lastch = 0;    unsigned int i = 0;    unsigned int l = 1;    for(;;)    {      char ch = s[i];      if (ch == t)        a |= m;      else if (ch == star)      {        if (r.rep->virt = lastch == t)          *rs = a | ~(m - 1);        else          *rs = a;        break;      }      else if (ch != f)      {        *rs = a;        break;      }      lastch = ch;      if (++i == sl)      {        *rs = a;        break;      }      else if (i % BITSETBITS == 0)      {        *rs++ = a;        a = 0;        m = 1;        ++l;      }      else        m <<= 1;    }    r.rep->len = l;    trim(r.rep);  }  return;}#elseBitSet shorttoBitSet(unsigned short w) {  BitSet r;  r.rep = BitSetalloc(0, &w, 1, 0, 2);  trim(r.rep);  return r;}BitSet longtoBitSet(unsigned long w){  BitSet r;  unsigned short u[2];  u[0] = w & ((unsigned short)(~(0)));  u[1] = w >> BITSETBITS;  r.rep = BitSetalloc(0, &u[0], 2, 0, 3);  trim(r.rep);  return r;}BitSet atoBitSet(const char* s, char f, char t, char star) {  BitSet r;  int sl = strlen(s);  if (sl != 0)  {    r.rep = BitSetresize(r.rep, sl / BITSETBITS + 1);    unsigned short* rs = r.rep->s;    unsigned short a = 0;    unsigned short m = 1;    char lastch = 0;    unsigned int i = 0;    unsigned int l = 1;    for(;;)    {      char ch = s[i];      if (ch == t)        a |= m;      else if (ch == star)      {        if (r.rep->virt = lastch == t)          *rs = a | ~(m - 1);        else          *rs = a;        break;      }      else if (ch != f)      {        *rs = a;        break;      }      lastch = ch;      if (++i == sl)      {        *rs = a;        break;      }      else if (i % BITSETBITS == 0)      {        *rs++ = a;        a = 0;        m = 1;        ++l;      }      else        m <<= 1;    }    r.rep->len = l;    trim(r.rep);  }  return r;}#endifostream& operator << (ostream& s, const BitSet& x){  if (s.opfx())    x.printon(s);  return s;}void BitSet::printon(ostream& s, char f, char t, char star) const// FIXME:  Does not respect s.width()!{  trim(rep);  register streambuf* sb = s.rdbuf();  const unsigned short* s = rep->s;  const unsigned short* top = &(s[rep->len - 1]);  while (s < top)  {    unsigned short a = *s++;    for (int j = 0; j < BITSETBITS; ++j)    {      sb->sputc((a & 1)? t : f);      a >>= 1;    }  }  if (!rep->virt)  {    unsigned short a = *s;    if (rep->len != 0)    {      for (int j = 0; j < BITSETBITS && a != 0; ++j)      {        sb->sputc((a & 1)? t : f);        a >>= 1;      }    }    sb->sputc(f);  }  else  {    unsigned short a = *s;    unsigned short mask = ONES;    unsigned short himask = (1 << (BITSETBITS - 1)) - 1;    if (rep->len != 0)    {      for (int j = 0; j < BITSETBITS && a != mask; ++j)      {        sb->sputc((a & 1)? t : f);        a = (a >> 1) & himask;        mask = (mask >> 1) & himask;      }    }    sb->sputc(t);  }  sb->sputc(star);}int BitSet::OK() const{  int v = rep != 0;             // have a rep  v &= rep->len <= rep->sz;     // within bounds  v &= rep->virt == 0 || rep->virt == 1; // valid virtual bit  if (!v) error("invariant failure");  return v;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -