привет колеги,
както обърнаха внимание някои колеги в basefile-а за домашното подозрително присъства оператор >>, за който се споменава в условието, че трябва да бъде написан. нещо повече - той е бъгав ?!
хм... изненада и за мен, но обяснението е много просто. условието на задачата е част от един семинар по ООП, проведен с някои от групите. там демонстрирах стъпка по стъпка изработката на оператора "<<", който трябваше да ви е за ориентир. в края на лекцията загатнах как би следвало да се реализира ">>" (т.е.. по аналог), но явно по погрешка съм записал "демонстрацията". в този ред на мисли - оператор "<<" е тестван, а оператор ">>" - не е. от там и бъговете...
та, както е забелязал колегата Тодоров, тази реализация е грешна. в нея редът с ">>" трябва да се замени с ">>=". той, обаче, е пропуснал да забележи, че има още един бъг - цикълът продължава един път повече и се получава прехвърляне границите на масива. в следствие на което b.cnt придобива странни стойности. т.е. трябва в проверката на цикъла ++ да е инфиксен, а не постфиксен. с други думи правилното решение изглежда така (в червено са промените) :
int operator >> (BitBucket &b, const int n) { unsigned char o = 0, r; // o : overflow, r : current remaining int i = 0; // iterate over all elements of data[] // starting from the 'MOST' significant // which in this example happens to be // the FIRST element of the data[] array do { r = b.data[i]; r <<= sizeof (unsigned char) * 8 - n; b.data[i] >>= n; b.data[i] |= o; o = r; } while (++i < SZ); b.cnt -= n; if (b.cnt < 0) b.cnt = 0; return o; }
така, заради това недоглеждане, както изглежда най-сложното подусловие отпада.
все пак, за всички, които желаят да покажат добро разбиране на shift-left и shift-right обявяваме следното бонус условие, което ще доведе до допълнителни точки :
- да се реализират операторите > и <, които правят rotate-left и rotate-right. това са операции, при които битовете, които са в "пренос" при преместването се записват като старши или младши в противоположния край на структурата.
например ако имаме 10100110 10100110 10100110 10100000, при прилагане на оператор < с 3 ще получим резултат 00110101 00110101 00110101 00000101