![]() |
|
|
![]()
|
|
| l2_mik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 22.11.2007 Репутация: нет Всего: нет |
Скажем, есть 16-разрядное слово
необходимо поменять в нем биты местами, не изменяя их значения 0-й и 15-й, 1-й и 14-й, ....... 7-й и 8-й Требования к алгоритму: простота и быстродействие У кого есть идеи для решения данной задачи! Жду с нетерпением! |
|||
|
||||
| Optimus |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 1.9.2007 Репутация: нет Всего: 14 |
Алгоритм:
Есть переменная slovo(есть 16-разрядное слово), создаём новыю переменную temp, Начинаем проверять биты с 15-го в slovo, если там единица то увеличиваем temp на 2 в степень (кол. итерации - 1, для первой итерации 0, для второй 1...) slovo = temp Допустим int имеет 2 байта
--------------------
"постановка задачи наполовину решает саму задачу" |
|||
|
||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 2 Всего: 134 |
А что тут думать, используй табличный поиск и всё.
Таблицу хоть питоном хоть bash'ом сгенерируй.
проще некуда. Добавлено @ 17:41 Или вначале засвопь полуслова (по 8 бит) в слове, а потом зареверси их хоть той же таблицей: на вскидку
Это сообщение отредактировал(а) Mayk - 22.3.2008, 17:44 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| maxdiver |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
Уоррен "Алгоритмические трюки"
(здесь, правда, 32-битное число, но изменить несложно)
|
||||
|
|||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| l2_mik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 22.11.2007 Репутация: нет Всего: нет |
Всем большое спасибо!
Я пока остановлюсь на решении которое предложил maxdiver, т.к. оно наиболее полно отвечат требованиям, а именно: простота и быстродейстие. Optimus - предложенный тобой алгоритм, значительно сложнее, Mayk - твое решение наверное самое быстрое, но занимает много места; Akina - я не силен в Ассемблере может прокоментируешь как работает программа? С Уважением! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Сначала в образах. Представь 2 трубки. В одной - 16 разноцветных шариков. Мы берем из нее сверху по одному шарику и бросаем во вторую трубку. Когда мы проделаем это 16 раз, шарики окажутся во второй трубке, а цвета будут перевернуты вверх ногами. Именно это делает мой код с битами в регистрах. Изначально считаем, что слово, подлежащее реверсу, передается в регистре АХ (это в общем достаточно стандартный способ передачи). Строки 1 и 2 просто прячут в стек содержимое 2 регистров, которые мы будем использовать и попортим (мы же не хотим гадить?) Строка 3 запихивает в СХ число 16 - это будет наш счеткчик цикла Строка 4 - это просто метка, понадобится позднее Строки 5 и 6 как раз делают то, что описано с шариками. Первая команда выталкивает очередной бит из АХ в регистр флага переноса, вторая оттуда засовывает его в регистр ВХ. При этом биты в АХ выталкиваются влево (т.е. в регистр выталкивается старший бит), и соответственно заталкиваются в ВХ справа (со старших). Можно было сделать и со младших - используя пару rcr ax/rcl bx - это непринципиально. Строка 7 уменьшает содержимое СХ на единичку (мы туда 16 запихали, помнишь?) и сравнивает с нулем. Если ноль НЕ получился - идет возврат на метку, на строку 4. А если ноль - то выполнение продолжается дальше Строка 8 полученный нам нужный результат из ВХ копирует в АХ - возврат результата в нем тоже стандартен Строки 9 и 10 просто восстанавливают значения использованных нами регистров Вот собсно и всё. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Можно обойтись табличкой реверса байтов. Тогда реверс битов в WORD == обмен байтов + замена каждого байта. Добавлено через 1 минуту и 35 секунд Сразу не заметила, Mayk уже это написал. Тогда не пойму, что тут много места занимает - табличка на 256 байтов? -------------------- ... |
|||
|
||||
| l2_mik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 22.11.2007 Репутация: нет Всего: нет |
Большое спасибо Akina,
Все гениальное просто! Ув. Earnest - этот алгоритм будет крутиться в ПЛК у которого с памятью острый дефицит. Благодарю всех за советы |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |