домашно : The BitBucket Class
Даден е класът BitBucket, който е частично реализиран.Частичната реализация можете да намерите непосредствено до домашното.
Той организира масиви от битове, за които се приема, че имат наредба и които са записани в private променлива data, която може да организира SZ на брой елементи от тип unsigned char.
В примерът data е от тип unsigned char, но в действителност алгоритъмът на работа на BitBucket следва да е валиден за всички 'размери' данни.
Класът е предвиден да реализира следните оператори :
friend ostream& operator << (ostream &, BitBucket &); // (1)
friend int operator << (BitBucket &, const int); // (2)
friend int operator >> (BitBucket &b, const int n); // (3)
BitBucket& Bitbucket::operator | (BitBucket &); // (4)
BitBucket& Bitbucket::operator & (BitBucket &); // (5)
bool Bitbucket::operator [] ( int ); // (6)
но програмистът, който е започнал работа по него е довършил само първите два и е качил кода в интернет за свободен достъп.
По своето същество първият (1) се използва просто за извеждане на организираните от BitBucket данни на стандартния изход.
Вторият (2) метод реализира "добавяне" на битове като съществуващите вече се "изместват вляво" и празните "нови" позиции се попълват с нули.
За улеснение се приема, че изместването става с не повече от n на брой елемента, като
1 <= n <= sizeof(unsigned char)
Тоест, за улеснение се приема, че изместването става с не повече от n на брой елемента, като 1 <= n <= sizeof(unsigned char)...
Третият метод на класа (3) липсва в момента, но следва да прави същото като (2) в обратна посока - "изместване вдясно", като добавените битове от ляво са нули, а тези, които "изпадат" при изместването вдясно се връщат като резултат от изпълнението на оператора. Смисълът на операцията е илюстриран със следната схема :
Операциите (4) и (5) се прилагат цялостно в/у BitBucket структури като се извършва побитов AND и побитов OR за всеки пореден бит в организираните от BitBucket битове.
Операцията (6) връща стойността true/false на n-тия бит в структурата data[], като се приема, че битовете се броят от дясно на ляво.
Тоест 3-тия бит е в последния елемент на data, a 35-тия в предпоследния елемент при положение, че работим с размер на int от 4 байта (стандартно за 32 битово приложение).
Бонус :
да се реализират оператори < и >, които работят по аналогия на << и >>, но запазват преноса в противоположния байт на структурата (.т.е. това са операци rotate left и rotate right).
Допълнете реализацията на класа BitBucket, така че да реализира (3), (4), (5) и 6.
Hint :
Вдясно е дадена илюстрация на последователността на операциите, които следва да се извършват за реализация на метода (3), като примерът е за n = 3.
Тук с "o" е обозначен преноса на битове от предната итерация, с "r" новият пренос от текущата итерация, а data[i] е съдържанието на поредния елемент от структурата, организираща битовете.
Hint :
Реализацията на (4) и (5) е много сходна и може да се извърши цялостно в/у всеки елемент от масива с данните.
Hint :
Един от най-добрите помощници за тази задача е калкулатора
Hint за (6) : Ако приемем, че data[m-1] е последният елемент на data, то k-тия бит се намира в елемента на позиция (m - 1 - k / (sizeof(*data)))
Base File :
Можете да използвате наличния код като отправна точка. Ползването на метода за изход на структурата дава информация за състоянето на структурата като битове.
Предаване на решенията :
Решенията се предават в мудъл в архив с име
FNXXXXX.zip
където XXXXX е факултетния ви номер.
Предава се само изходен код (допуска се всичко да е в един CPP файл).
Срок на предаване : до 1 май и нито ден по-късно.
РЕШЕНИЯТА ЩЕ БЪДАТ ПРОВЕРЯВАНИ ЗА ПЛАГИАТСТВО СЪС СПЕЦИАЛИЗИРАН СОФТУЕР