2012-03-09 11 views
0

У меня есть очередь и массив массивов. buckets - это массив, а collector - очередь. pass - целое число, которое сохраняет, кто проходит. У меня есть метод, который возвращает мне содержимое первой ячейки очереди, которая называется peek(). shiftOne() - метод, который перемещает голову одной очереди в хвост другой.Radix Sort C++ Не маскирующие биты

Сейчас этот код не работает для меня

bucket[((collector.peek()>>(pass * 8)) &0xFF)].shiftOne(collector); 

Я пошел шаг за шагом, и это получится, я не маскировать биты правильно. Я могу их переместить, но это все. Поэтому я попытаюсь получить доступ к элементу 102 для массива из 10 элементов. Что я делаю не так? Я знаю peek() и shiftOne(), потому что могу сортировать с использованием мощностей и модуля.

+1

«8» и «0xFF» согласны с использованием сортировки radix-256, и в этом случае ваши массивы должны быть 256 элементов (и доступ к элементу 102 просто хорош) –

ответ

2

Вы путаете radix-10 с radix-2.

Бит сдвига является деление на 2, так, например: 102 >> 1 = 102/2 = 51.
Аналогично: 102 >> 8 = 102/2^8 = 102/256 = 0 (в int выражении).

(i >> 8) & 0xFF код, например, используется для извлечения содержимого второго байта данного i значения.

Для вашего случая - палка с делениями на 10 с модулем.

+1

На самом деле выглядит так, что он путаница radix-256 с основанием -10, поскольку он сдвигает 8 бит за раз. –