Цитата(bbill @ Nov 6 2008, 16:28)

Появилась необходимость (из-за разводки) перевернуть байт:
было 0b76543210
стало 0b01234567
Можно тупо bld/bst, но хотелось бы покороче. Кто сталкивался с подобной задачей.
P.S. В поиске нашел только обсуждение о перестановке двух бит.
Я когда такое делал, особо не задумывался, про bld/bst не знал, да и задачи экономии ресурсов не стояло. Поэтому получилась такая программа на C. (листинг после компиляции в WinAVR)
Код
static const uint8_t REVERT_NIBBLE[] =
{
0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
};
uint8_t
Revert_Byte(uint8_t Data)
{
4ea: 98 2f mov r25, r24
4ec: 92 95 swap r25
4ee: 9f 70 andi r25, 0x0F; 15
4f0: ed e4 ldi r30, 0x4D; 77
4f2: f1 e0 ldi r31, 0x01; 1
4f4: df 01 movw r26, r30
4f6: a9 0f add r26, r25
4f8: b1 1d adc r27, r1
4fa: 8f 70 andi r24, 0x0F; 15
4fc: e8 0f add r30, r24
4fe: f1 1d adc r31, r1
500: 80 81 ld r24, Z
502: 82 95 swap r24
504: 80 7f andi r24, 0xF0; 240
506: 9c 91 ld r25, X
508: 89 2b or r24, r25
return((REVERT_NIBBLE[Data >> 4]) | ((REVERT_NIBBLE[Data & 0x0F] << 4)));
}
50a: 99 27 eor r25, r25
50c: 08 95 ret
IMHO на асме с bld/bst будет и короче и быстрее