![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Янус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 14.2.2010 Репутация: нет Всего: нет |
Господа, окажите пожалуйста помощь в реализации алгоритма перестановки на С++. Задача следующая: есть двоичное число размером в байт, биты этого числа нужно переставить по определенному правилу 0->5; 1->4; 2->8 и т.д.Или дайте ссылочку где об этом можно почитать.
|
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
В чём проблема? Проверить биты числа? Переставлять их не надо, поскольку есть только 2 значения 0 и 1, нужно только установить/сбросить соответствующий бит.
а и т.д. означает 3->6 (2->7, т.к. бита 8 в байте нет)? ![]() Это сообщение отредактировал(а) Albor - 14.2.2010, 18:51 |
|||
|
||||
Янус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 14.2.2010 Репутация: нет Всего: нет |
Нет биты надо именно переставить. Т.е до перестановки 00000001, после перестановки 00100000.
|
|||
|
||||
Albor |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
Понимаешь, если бы цифер было больше, то можно говорить о перестановке, а так - просто нужно решить задачу. Если присмотреться к алгоритму, то можно увидеть, что 0 и 1 разряды младшего полубайта становятся соответствено 1-м и 0-м в старшем полубайте, то же самое и со старшими разрядами. Значит сначала можно просто поменять в младшем и старшем полубайте разряды местами : 0->1, 2->3, 4->5, 6->7. После сдвинуть младший полубайт влево, а старший вправо на 4 разряда. Объединив половинки получим целое.
|
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Янус, в общем случае, тебе нужны побитовые операции: сдвиги, а так же операции "И" и "ИЛИ". Сдвигаешь число на N бит вправо и операцией "И" накладываешь маску 1. В результате получишь значение бита N. Затем результат сдвигаешь влево на M бит и операцией "ИЛИ" накладываешь на результат. Повторяешь для всех бит. Только не забудь обнулить результат перед началом действий.
|
|||
|
||||
Янус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 14.2.2010 Репутация: нет Всего: нет |
Господа, я дико извеняюсь, но чисел действительно больше, а именно 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. Извените за некорректно поставленный вопрос. |
|||
|
||||
Янус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 14.2.2010 Репутация: нет Всего: нет |
После долгих раздумий у меня получилось следующее...
Эта функция работает, но может, кто подправит ее (сделает более правильной ) или подскажет более оптимальное решение ? |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
Если заполнить матрицу 8х8 последовательными значениями построчно, а потом прочитать её столбцами, ты получишь то же самое. Перестановка битов здесь причём?
Это сообщение отредактировал(а) Albor - 14.2.2010, 22:43 |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
||||
|
||||
Янус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 14.2.2010 Репутация: нет Всего: нет |
На вход подается 64-битное двоичное число(записано в символьном массиве) , затем в нем меняются местами биты, с использованием вектора перестановки, по описанному выше правилу.
|
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
Если правило не будет изменяться, то просто выводим исходный массив в нужной последовательности
|
|||
|
||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Так вроде работает, особо времени тестировать нет. movebit перемещает бит с индексом bi из переменной vf в переменную vt по твоему правилу. Прбеги по битам циклом |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
можно короче :
да и остальное можно попроще.. Добавлено через 4 минуты и 58 секунд однако перестановка битов тут все равно излишняя, так как
т.е операции идут с байтами, а не битами.. если ж символьный массив был упомянут для облегчения задания, и нужно все таки оперировать с битами, то вот еще вариантик :
|
||||||
|
|||||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
mes, да, я действительно делаю через зад =(
|
|||
|
||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Это сообщение отредактировал(а) bsa - 15.2.2010, 15:51 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |