| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Порядок битов поменять на обратный |
| Автор: Crafty 4.7.2009, 00:41 | ||
| Необходимо написать функцию, которая меняет порядок битов в целом числе без знака на обратный. Вот кое-что написал, посоветуйте как можно улучшить функцию reverseBits.
|
| Автор: W4FhLF 4.7.2009, 04:50 |
| http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious |
| Автор: Soah 12.7.2009, 11:53 | ||
|
| Автор: Леопольд 13.7.2009, 20:38 | ||||||
Это тоже самое что и x = ~x Т.е. не то. Не думаю что можно так просто сделать. Наверное, всё же, придётся в цикле.
По моему, так попроще выглядит |
| Автор: mes 13.7.2009, 20:45 |
а предложенное http://forum.vingrad.ru/index.php?showtopic=265503&view=findpost&p=1913069, чем не устраивает то ? |
| Автор: Леопольд 13.7.2009, 20:50 | ||
Меня устраивает полностью. Но для универа не подойдёт. Я бы шаблон написал... |
| Автор: GoldFinch 13.7.2009, 20:52 | ||
(для x86-32) Добавлено через 9 минут и 48 секунд ого! нафига делать за "3-4" операции если там деление и умножение %) както это нежизнеспособно ниразу |
| Автор: GoldFinch 13.7.2009, 21:29 |
| я тоже сначала только 1 заметил |
| Автор: Леопольд 13.7.2009, 21:29 | ||
Я видел два. Но суть не в этом. Была просьба "подправить" уже написанную функцию, что я и сделал... На первый взгляд "Reverse bits the obvious way" самый простой. Но он уже оптимизирован, причём несколькими людьми, в течении нескольких лет... |
| Автор: W4FhLF 14.7.2009, 11:42 |
Ты забыл добавить: x86-32-MSC++(=> Win32 only) Не более, чем у тебя |
| Автор: GoldFinch 14.7.2009, 12:02 |
| W4FhLF, с точки зрения наглядности, цикл лучше всего, с точки зрения быстродействия мой вариант лучше их умножения. |
| Автор: W4FhLF 14.7.2009, 12:20 |
Ну во-первых твой вариант можно переписать без потери переносимости. А во-вторых, я думаю когда ты его писал, то занимался premature optimization. Есть измерения, на каких объёмах эта оптимизация становится оправдана для среднестатистических десктопов? |
| Автор: GoldFinch 14.7.2009, 13:06 |
| W4FhLF, я что в голову пришло, то и написал, никакой оптимизации. правда я было думал что в MSVC есть интринсик __bswap(), а оказалось его нет. Добавлено через 4 минуты и 11 секунд а то что по сравнению с циклом это premature optimization - не факт. это чистая функция с вполне понятным названием и прототипом. то как она реализована - никак не влияет на код где она используется. время на ее написание - примерно такое же как и на написание цикла (если понимаешь что делаешь) читается легко (если понимаешь что делают сдвиги и маски) |
| Автор: mes 14.7.2009, 13:52 | ||||
солидарен с GoldFinch - никакой преждевременной оптимизации (__bswap не расматриваем) тут нет, просто реализация иного алгоритма, функция изначально преднаначена для реализации некой двоичной логики, и для программиста с точки зрения временных затрат, если он нормально ориентируется в двоичной с.с.,такой вариант, ничуть не сложней циклического подхода. P.S. только вместо inta все ж лучше использовать unsigned. (будем считать что опечатка |
| Автор: W4FhLF 14.7.2009, 14:10 |
| Да я вообще-то тоже за подход с масками и сдвигами, но без ассемблера, он там не нужен. |
| Автор: GoldFinch 14.7.2009, 14:14 |
| W4FhLF, глупо реализовывать bswap если она уже есть |
| Автор: W4FhLF 14.7.2009, 14:23 | ||
| GoldFinch, глупо терять переносимость не получая ничего взамен. Добавлено через 1 минуту и 43 секунды
|
| Автор: GoldFinch 14.7.2009, 15:18 |
| W4FhLF, оно у тебя только 16разрядные слова местами меняет, а нада еще байты поменять меня так просто жаба душит 1 инструкцию на 5-6 операций заменять ради переносимости на не-х86 |
| Автор: W4FhLF 14.7.2009, 16:34 | ||||||
Не проблема переделать. Хотя для задачи и не требуется.
Что-то твой код у меня вообще неправильно работает. А переносимости у него нет даже в пределах одной аппаратной платформы, между компиляторами (http://www.comeaucomputing.com/tryitout/). Плюс у тебя в коде идёт вызов доп. процедуры (__bswap), студия не инлайнит её на /O2. Из-за этого происходит сброс конвеера, а это куда хуже 3-4 операций сдвига и or. |
| Автор: mes 14.7.2009, 16:36 | ||
GoldFinch, как всегда в своем репертуаре |
| Автор: GoldFinch 14.7.2009, 17:43 |
| W4FhLF, я его не проверял, неудивительно что не работает |