// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП
//
// bitfield.cpp - Copyright (c) Гергель В.П. 07.05.2001
//
// Битовые поля

#include "bitfield.h"

TBitField :: TBitField(int len) : BitLen(len) {
  MemLen = ( len + 15 ) >> 4; // в эл-те pМем 16 бит (TELEM==int)
  pMem   = new TELEM[MemLen];
  if ( pMem != NULL )
    for ( int i=0; i < MemLen; i++ ) pMem[i] = 0;
}              /*---------------------------------------------*/

TBitField :: TBitField(const TBitField &bf) { // конструктор копирования


Skipped...

}              /*---------------------------------------------*/

TBitField :: ~TBitField() {


Skipped...

}              /*---------------------------------------------*/

int TBitField :: GetMemIndex ( const int n ) const { // индекс Мем для бита n
  // преобразовать к int и разделить на 16
  return n >> 4; // в эл-те pМем 16 бит
}              /*---------------------------------------------*/


TELEM TBitField :: GetMemMask ( const int n ) const { // битовая маска для бита n
  // преобразовать к int, найти остаток от деления на 16 и сдвинуть
  return 1 << (n & 15);
}              /*---------------------------------------------*/

// доступ к битам битового поля

int TBitField :: GetLength(void) const { // получить длину (к-во битов)
  return BitLen;
}              /*---------------------------------------------*/

void TBitField :: SetBit ( const int n ) { // установить бит
  if ( (n > -1) && (n < BitLen) )
    pMem[GetMemIndex(n)] |= GetMemMask(n);
}              /*---------------------------------------------*/

void TBitField :: ClrBit ( const int n ) { // очистить бит


Skipped...

}              /*---------------------------------------------*/

int TBitField :: GetBit ( const int n ) const { // получить значение бита


Skipped...

}              /*---------------------------------------------*/

// битовые операции

TBitField & TBitField :: operator=(const TBitField &bf) { // присваивание


Skipped...

}              /*---------------------------------------------*/

int  TBitField :: operator==(const TBitField &bf) {  // сравнение
  int res = 1;
  if ( BitLen != bf.BitLen ) res = 0;
  else
    for ( int i=0; i < MemLen; i++ )
      if ( pMem[i] != bf.pMem[i] ) { res = 0; break; }
  return res;
}              /*---------------------------------------------*/


TBitField TBitField :: operator| (const TBitField &bf) {  // операция "или"
  int i, len = BitLen;
  if ( bf.BitLen > len ) len = bf.BitLen;
  TBitField temp(len);
  for ( i=0; i < MemLen;    i++ ) temp.pMem[i]  =    pMem[i];
  for ( i=0; i < bf.MemLen; i++ ) temp.pMem[i] |= bf.pMem[i];
  return temp;
}              /*---------------------------------------------*/


TBitField TBitField :: operator& (const TBitField &bf) {  // операция "и"


Skipped...

}              /*---------------------------------------------*/

TBitField TBitField :: operator~ ( void ) {  // отрицание


Skipped...

}              /*---------------------------------------------*/

// ввод/вывод

istream &operator>>(istream &istr, TBitField &bf) { // ввод
  // формат данных - последовательность из 0 и 1 без пробелов
  // начальные пробелы игнорируются
  // при получении не 0 или 1 - завершение ввода
  int i=0; char ch;
  // поиск {
  do { istr >> ch; } while (ch != ' ');
  // ввод элементов и включение в множество
  while (1) { istr >> ch;
    if ( ch == '0' ) bf.ClrBit(i++);
    else if ( ch == '1' ) bf.SetBit(i++); else break;
  }
  return istr;
}              /*---------------------------------------------*/

ostream &operator<<(ostream &ostr, const TBitField &bf) { // вывод


Skipped...

}              /*---------------------------------------------*/
Хостинг от uCoz