Страница 1 из 2
Подскажите как красиво перевернуть байт
Добавлено: Сб сен 08, 2007 09:31:42
Dany
Байт= 7.......0, нужно для вывода в порт перевернуть Байт= 0......7.
Не менять же вручную биты?
Добавлено: Сб сен 08, 2007 09:42:23
ARV
цикл 8 раз из двух сдвигов через перенос - один влево, другой вправо - это красиво? на Си будет записано кучей сдвигов в одну строку, но результат будет тот же...
Добавлено: Сб сен 08, 2007 09:50:23
Dany
Вот так мне и не хочется делать, но ничего не приходит в голову. Пишу на С, вот мне и интересно, не ужели все пользуют макрос со сдвигами?
Добавлено: Сб сен 08, 2007 09:58:28
ARV
вряд ли что можно придумать что-то принципиально иное и лучшее... но можно подумать над тем, чтобы данные сразу готовились в "перевернутом" формате еще на этапе компиляции или на этапе их получения...
Добавлено: Сб сен 08, 2007 10:05:03
Dany
Данные как данность, с ними не придумаешь, они приходят из вне. Только если физически изменить разводку порта в схеме, тогда ничего не надо будет переворачивать.
Спасибо ARV за оперативное содействие и активное участие. Буду думать, что выбрать физический или программный метод:)
Добавлено: Сб сен 08, 2007 10:28:57
Кошкелот
Еще остается табличный метод. 256 байтов в ПЗУ, адрес - исходный байт плюс константа, значение - любое. Не шибко "красиво", но быстро.
Добавлено: Сб сен 08, 2007 10:33:13
Dany
Нее табличный метод совсем не по душе, а временные рамки не критичны.
Добавлено: Сб сен 08, 2007 10:33:27
Кошкелот
Код: Выделить всё
dst=0;
for(i=1, j=0x80;i<0x100;i<<1, j }} =1) if(src&i) dst|=j;
Тоже не ахти что, да...?
(очепятка,, да млин - не пойму, почему не вводится как пишу)
Вместо фигруных скобок читать угловые!!!
Добавлено: Сб сен 08, 2007 10:52:00
tych
В FAQ моего курса (по кнопке "www") это пункт:
"_05 перевернуть порядок битов в байте.txt"
Но движок форума "рубит" Си код.
Вот об этом -
http://www.radiokot.ru/forum/viewtopic.php?p=61763
Добавлено: Сб сен 08, 2007 11:39:54
Dany
Я остановился на таком коде
char reverse(char byte)
{
char result=0,
i;
for(i=0;i<8;i++)
{
if (byte & (1 << i))
{
result |= 1 << (7-i);
}
}
return result;
}
Добавлено: Сб сен 08, 2007 11:58:59
ARV
на ассемблере, конечно, красивше получается
Код: Выделить всё
ldi Temp, 8
m1:
ror r0
rol r1
dec Temp
brne m1
исходный байт в r0, результат в r1, Temp - какой-то вспомогательный регистр
у
tych-а неплохой код на Си -
если компилятор хорошо оптимизирует, то получится весьма оптимальный код, я
предполагаю в идеале почти вдвое более быстрый, чем этот кусок, но втрое большего объема

Добавлено: Сб сен 08, 2007 12:12:52
moLCHec
ИМХО: если не вариант ARV, а Си то табличный явно быстрее и меньше.
Таблица занимает 4 слова + 4...5 слов на извлечение и присвоение. А приводимый Си код слов на 10-ть тянет при оптимальном транслировании, а о скорости и говорить нечего.
Добавлено: Сб сен 08, 2007 12:22:07
ARV
а давайте микро-конкурс устроим -
кто сделает самый быстрый и одновременно самый короткий код для поставленной задачи на ассемблере? только давайте честно - не использовать листинг из-под Сишного компилятора. А можно заодно и компиляторы сравнить - включить оптимизацию по скорости и привести кусок листинга без купюр (и не выдавать его за свой собственный) - тогда конкурс не только между человеками будет, но и между компиляторами
есть желающие?

у меня пока вырисовывается код из 14-и однотактных команд...
Добавлено: Сб сен 08, 2007 12:26:34
ARV
moLCHec писал(а):ИМХО: если не вариант ARV, а Си то табличный явно быстрее и меньше.
Таблица занимает 4 слова + 4...5 слов на извлечение и присвоение. А приводимый Си код слов на 10-ть тянет при оптимальном транслировании, а о скорости и говорить нечего.
ошибаетесь, уважаемый, на счет
меньше - таблица будет из 128 слов (256 байтов)...
Добавлено: Сб сен 08, 2007 12:32:19
moLCHec
Согласен , что то меня сглючило. Башка гудит.

Добавлено: Сб сен 08, 2007 12:38:55
tych
ARV писал(а):давайте честно - не использовать листинг из-под Сишного компилятора.
Я в пролете ...
ARV писал(а):А можно заодно и компиляторы сравнить - включить оптимизацию по скорости и привести кусок листинга без купюр (и не выдавать его за свой собственный) - тогда конкурс не только между человеками будет, но и между компиляторами

Можно. Только какой код сравнивать будем ? Одинаковый ?
Добавлено: Сб сен 08, 2007 12:52:50
tych
Вот есть сделаный тест-сравнение компиляторов
http://www.atmanecl.com/EnglishSite/CCCE.htm
Можно и его проверить на достоверность.
Там кстати к AVR и 8051 "пристегнули"

Добавлено: Сб сен 08, 2007 12:59:32
Мышонок
Что такоё стеки и деки знаете?
Пользуйтесь!

Добавлено: Сб сен 08, 2007 13:22:09
ARV
2
tych:
во-первых, почему в пролете?
во-вторых, твой код можно и сравнивать

мне лично он понравился. сам придумал?
в-третьих: честно говоря, почти все "уже придумано до нас" - но совсем не интересно смотреть на готовые результаты тестов, интереснее свое замутить...
2
мышонок: если идея конкурса понравилась, то лучше код, а не совет. подсказки в конкурсе - это нечестно...
Добавлено: Сб сен 08, 2007 13:27:53
Dany
Какая популярная тема оказалась:) Меня устроил приведенный код, так как переворачивать надо только 1 байт. Поэтому вопросы оптимизации отпадают. Код зато читаем и без магических чисел, просто и красиво.