Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Реализация алгоритма перестановки |
Автор: Янус 14.2.2010, 18:34 |
Господа, окажите пожалуйста помощь в реализации алгоритма перестановки на С++. Задача следующая: есть двоичное число размером в байт, биты этого числа нужно переставить по определенному правилу 0->5; 1->4; 2->8 и т.д.Или дайте ссылочку где об этом можно почитать. |
Автор: Albor 14.2.2010, 18:48 |
В чём проблема? Проверить биты числа? Переставлять их не надо, поскольку есть только 2 значения 0 и 1, нужно только установить/сбросить соответствующий бит. а и т.д. означает 3->6 (2->7, т.к. бита 8 в байте нет)? ![]() |
Автор: Янус 14.2.2010, 19:12 |
Нет биты надо именно переставить. Т.е до перестановки 00000001, после перестановки 00100000. |
Автор: bsa 14.2.2010, 21:06 |
Янус, в общем случае, тебе нужны побитовые операции: сдвиги, а так же операции "И" и "ИЛИ". Сдвигаешь число на N бит вправо и операцией "И" накладываешь маску 1. В результате получишь значение бита N. Затем результат сдвигаешь влево на M бит и операцией "ИЛИ" накладываешь на результат. Повторяешь для всех бит. Только не забудь обнулить результат перед началом действий. |
Автор: Янус 14.2.2010, 21:18 |
Господа, я дико извеняюсь, но чисел действительно больше, а именно 64.... Вот перестановочный вектор. {0,8,16,24,32,40,48,56,1,9,17,25,33,41,49,57,2,10,18,26,34,42,50,58,3,11,19,27,35,43,51,59,4,12,20,28,36,44,52,60,5, 13,21,29,37,45,53,61,6,14,22,30,38,46,54,62,7,15,23,31,39,47,55,63}; Т.е значения битов по номерам 0->0; 1->8;2->16 Значение бита с номером 0 остается на месте, а значение бита с номером 1 перебрасывется в бит с номером 8. Извените за некорректно поставленный вопрос. |
Автор: Янус 14.2.2010, 21:40 | ||
После долгих раздумий у меня получилось следующее...
Эта функция работает, но может, кто подправит ее (сделает более правильной ) или подскажет более оптимальное решение ? |
Автор: Albor 14.2.2010, 22:31 | ||
Если заполнить матрицу 8х8 последовательными значениями построчно, а потом прочитать её столбцами, ты получишь то же самое. Перестановка битов здесь причём?
|
Автор: Albor 14.2.2010, 23:09 |
И я подумал, может я и не прав. Янус, можно пример входных и выходных данных? |
Автор: Янус 14.2.2010, 23:36 |
На вход подается 64-битное двоичное число(записано в символьном массиве) , затем в нем меняются местами биты, с использованием вектора перестановки, по описанному выше правилу. |
Автор: Albor 15.2.2010, 07:17 | ||
Если правило не будет изменяться, то просто выводим исходный массив в нужной последовательности
|
Автор: NewDima 15.2.2010, 10:06 | ||
Так вроде работает, особо времени тестировать нет. movebit перемещает бит с индексом bi из переменной vf в переменную vt по твоему правилу. Прбеги по битам циклом |
Автор: mes 15.2.2010, 10:41 | ||||||
можно короче :
да и остальное можно попроще.. Добавлено через 4 минуты и 58 секунд однако перестановка битов тут все равно излишняя, так как
т.е операции идут с байтами, а не битами.. если ж символьный массив был упомянут для облегчения задания, и нужно все таки оперировать с битами, то вот еще вариантик :
|
Автор: NewDima 15.2.2010, 11:13 |
mes, да, я действительно делаю через зад =( |
Автор: NewDima 15.2.2010, 11:30 | ||
|
Автор: bsa 15.2.2010, 15:50 | ||
|