привет колеги,
както обърнаха внимание някои колеги в 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