Страница 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 "пристегнули" :lol:

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

Пользуйтесь! :))

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

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