ARV писал(а):сам придумал?
Как обычно НЕТ ! Но автор там указан. Я FAQ собираю из всего, на мой взгляд, интересного и полезного новичку.
ARV писал(а):сам придумал?
не редкость, когда мысль или идея и самого автора переживает, чего ж удивляться, что тема стала популярной и зажила своей жизнью?Dany писал(а):Какая популярная тема оказалась:) Меня устроил приведенный код, так как переворачивать надо только 1 байт. Поэтому вопросы оптимизации отпадают. Код зато читаем и без магических чисел, просто и красиво.
ARV писал(а):почти все команды выполняются 1 такт
Код: Выделить всё
// 5 tmp = ((in & 0x0F) <<4>> 4);
LDI R30, `in`
LD R17, Z
SWAP R17
ANDI R17, 0xF0
LD R16, Z
SWAP R16
ANDI R16, 0x0F
OR R16, R17
STD Z+2, R16
// 6 tmp = ((tmp & 0x33) <<2>> 2);
MOV R17, R16
ANDI R17, 0x33
LSL R17
LSL R17
ANDI R16, 0xCC
LSR R16
LSR R16
OR R16, R17
STD Z+2, R16
// 7 out = ((tmp & 0x55) <<1>> 1);
MOV R17, R16
ANDI R17, 0x55
LSL R17
ANDI R16, 0xAA
LSR R16
OR R16, R17
STD Z+1, R16ARV писал(а):я был лучшего мнения о компиляторах Си![]()
Dany писал(а):Байт= 7.......0, нужно для вывода в порт перевернуть Байт= 0......7.
Не менять же вручную биты?
bezobraznic писал(а):Dany писал(а):Байт= 7.......0, нужно для вывода в порт перевернуть Байт= 0......7.
Не менять же вручную биты?
unsigned char Bit_Reverse( unsigned char x )
{
x = ((x >> 1) & 0x55) | ((x <<1>> 2) & 0x33) | ((x <<2>> 4) & 0x0f) | ((x << 4) & 0xf0);
return x;
}