![]() |
|
![]() ![]() ![]() |
|
Kallikanzarid |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 240 Регистрация: 9.11.2008 Репутация: нет Всего: 3 |
Есть ли инструкция для инверсии порядка битов в целочисленном регистре
То есть чтобы, например, 00011001 стал 10011000. Если нет, есть ли O(1) алгоритм, который бы это делал? ЗЫ: про предварительно обсчитанный массив знаю, но это, ИМХО, крайняя мера. |
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 2 Всего: 6 |
цикл с командами и промежуточным регистром
RCL RCR -------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
Mikl_ |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 8 Всего: 14 |
Такой инструкции нет, но есть команда BSWAP, которая изменяет порядок следования байтов в 32-разрядных регистрах, конвертируя значения из вида машинного представления (младшая часть, старшая часть) в обычное представление (старшая часть, младшая часть) и наоборот
Это сообщение отредактировал(а) Mikl_ - 12.11.2008, 10:58 |
||||||
|
|||||||
Kallikanzarid |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 240 Регистрация: 9.11.2008 Репутация: нет Всего: 3 |
Всем спасибо. Видимо, лучше всего таблицей :(
|
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 2 Всего: 6 |
-------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 8 Всего: 14 |
Kallikanzarid, если тебе так ненавистен цикл -- не обязательно переворачивать все 32 разряда. Достаточно выявить те байты, которые содержат ненулевые значения -- пример зеркалирования одного байта
Это сообщение отредактировал(а) Mikl_ - 12.11.2008, 11:59 |
|||
|
||||
Kallikanzarid |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 240 Регистрация: 9.11.2008 Репутация: нет Всего: 3 |
Mikl_, дело не в ненависти к циклу. Просто я сейчас проектирую систему, в которой, может быть, инверсия порядка битов станет узким местом. Поэтому мне полезно заранее узнать, будет ли эта операция быстрой. Таблицу, как оказалось, использовать невозможно (она бы занимала 17 гигов
![]() ![]() Это сообщение отредактировал(а) Kallikanzarid - 12.11.2008, 12:02 |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 8 Всего: 14 |
Kallikanzarid, вот поправка на 32-разрядные регистры (а можно и 64-х и 128 разрядные)
Это сообщение отредактировал(а) Mikl_ - 12.11.2008, 12:24 |
|||
|
||||
Kallikanzarid |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 240 Регистрация: 9.11.2008 Репутация: нет Всего: 3 |
За книгу спасибо, обязательно почитаю.
Добавлено через 3 минуты и 31 секунду Кстати, только что пришло в голову таблично преобразовывать каждый байт по отдельности (таблица всего 255 байт), а затем инвертировать уже порядок байт с помощью BSWAP. Вижу, ты тоже что-то такое придумал. 8) Добавлено через 10 минут и 43 секунды Что еще лучше, такой алгоритмический подход дает возможность писать код на С++, что менее головоломно. А вот проверять зеркальные байты - ИМХО, не лучшая идея, так как это сделать не так то просто - уж точно дольше, чем тупо извлечь из таблицы. |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 8 Всего: 14 |
Kallikanzarid, для табличного преобразования содержимого регистра AL в ассемблере есть специальная инструкция XLAT
|
|||
|
||||
Kallikanzarid |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 240 Регистрация: 9.11.2008 Репутация: нет Всего: 3 |
Буду иметь это ввиду, посмотрим, что скажет профилировщик.
|
|||
|
||||
DRUID3 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 20.6.2005 Где: Kyyiv Репутация: нет Всего: 9 |
Прошу прощения что вмешиваюсь - Kallikanzarid а у вас это задача для FFT? Если да, и битреверс встал как "узкое место"(!?) то есть алгоритмы FFT не требующие битреверсной перестановки (но при этом нужен дополнительный массив по размерам равный входному)... Ну а для быстрой свертки через FFT вообще битреверсная перестановка не нужна впринципе... Или я ошибаюсь относительно ваших целей?
-------------------- Every time if you use Linux, you are joined to the communism... практика - критерий истины ... отделенной от нас пропастью субъективного восприятия... |
|||
|
||||
Kallikanzarid |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 240 Регистрация: 9.11.2008 Репутация: нет Всего: 3 |
Я делаю контрол, строящий график непрерывной функции одного аргумента. Поскольку я использую его для демонстрации алгоритмов интерполяции, было бы хорошо сделать кэш. Я решил использовать бинарное дерево на массиве, в котором реверз индекса элемента соответствует положению точки на отрезке [1, ~0], а его легко отобразить на требуемый мне. То есть, обходя дерево до определенной, тривиально вычисляемой глубины, и применяя реверз, я получаю набор точек, расположенных достаточно близко, чтобы ломаная по ним хорошо приближала кривую при данном масштабе.
Я еще не проверял алгоритм на деле, так что я вполне могу ошибаться. Так, может оказаться, что я вообще не прав и все это никогда не будет работать, или что преобразование индекса в абсциссу сложнее, чем я думал, но все еще практично. Поживем - увидим. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm для начинающих" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для начинающих | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |