Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перестановка битов в байте.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ps1x
Как красивее всего сделать перестановку 7 и 8 битов в байте?
Дело в том, что развел и распаял плату и понял что ошибся, а все это заново делать честно говоря лень.
Объясните пожалуйста, как это можно реализовать программно.
Edmundo
Цитата(ps1x @ Aug 27 2006, 23:09) *
Как красивее всего сделать перестановку 7 и 8 битов в байте?
Дело в том, что развел и распаял плату и понял что ошибся, а все это заново делать честно говоря лень.
Объясните пожалуйста, как это можно реализовать программно.

В книге "Алгоритмические трюки для программистов" есть разные красивые алгоритмы перестановки, помню взял оттуда бит-реверсию для байта. Выглядело так:
Код
static inline unsigned char BitReverse(unsigned char cByte)
{
    int nU = (cByte*0x00020202),
        nM = 0x01044010,
        nS = nU & nM,
        nT = (nU << 2) & (nM << 1);
    return ((nS+nT)*0x01001001) >> 24;
}


Насчет 7 и 8-го посмотреть надо.

О том, где можно найти книгу, здесь.
_artem_
ui8 nbyte = byte;

nbyte = ((byte & 0x80)>>1) ^ (nbyte & 0xbf);
nbyte = ((byte & 0x40)<<1) ^ (nbyte & 0x7f);
singlskv
Цитата(ps1x @ Aug 27 2006, 23:09) *
Как красивее всего сделать перестановку 7 и 8 битов в байте?
Дело в том, что развел и распаял плату и понял что ошибся, а все это заново делать честно говоря лень.
Объясните пожалуйста, как это можно реализовать программно.

Асемблерной вставкой:
Код
;  4 words / 4 cycles; tmp= abcdefgh
reversbits78:    ; tmp= abcdefgh
    bst    tmp,7;     T=a
    lsl    tmp; tmp= bcdefgh0
    asr    tmp; tmp= bbcdefgh
    bld    tmp,6; tmp= bacdefgh
_artem_
pro eto vose zabil )

byte = ((byte & 0x80) >> 1 ) | ((byte & 0x40)<<1) | (byte & 0x3f);
ps1x
Всем большое спасибо smile.gif
singlskv
небольшой OFF
Вопросик:
Какой-нибудь компилятор для AVR умеет пользоваться битом T в SREG ?
(просто интересно встречалось ли такое кому-нибудь)
_artem_
может быть такой код будет трансформироватся в бит копирование (проверить надо по асм листингу )
Код
typedef struct
{
  ui8 bit1:1;
  ui8 bit2:1;
  ui8 bitn:6;
} bits;


ui8 temp = ((bits)byte).bit1;
((bits)byte).bit1 = ((bits)byte).bit2;
((bits)byte).bit2 = temp;
vet
singlskv, CodeVision активно использует бит Т в битовых операциях.
IgorKossak
Цитата(vet @ Aug 28 2006, 08:41) *
singlskv, CodeVision активно использует бит Т в битовых операциях.

IAR тоже.
singlskv
Цитата(IgorKossak @ Aug 28 2006, 11:53) *
Цитата(vet @ Aug 28 2006, 08:41) *

singlskv, CodeVision активно использует бит Т в битовых операциях.

IAR тоже.

А можно какой-нибудь пример кода?
otrog
Цитата(singlskv @ Aug 28 2006, 12:06) *
Цитата(IgorKossak @ Aug 28 2006, 11:53) *

Цитата(vet @ Aug 28 2006, 08:41) *

singlskv, CodeVision активно использует бит Т в битовых операциях.

IAR тоже.

А можно какой-нибудь пример кода?

Вот проводил недавно для себя небольшое исследование.
Компиляторы настроены на макс. оптимизацию по размеру кода.
ПС Выводы делайте сами
ППС Сильно не бейте - делал для себя smile.gif
Нажмите для просмотра прикрепленного файла
singlskv
Цитата(otrog @ Aug 28 2006, 13:43) *
Цитата(singlskv @ Aug 28 2006, 12:06) *

Цитата(IgorKossak @ Aug 28 2006, 11:53) *

Цитата(vet @ Aug 28 2006, 08:41) *

singlskv, CodeVision активно использует бит Т в битовых операциях.

IAR тоже.

А можно какой-нибудь пример кода?

Вот проводил недавно для себя небольшое исследование.
Компиляторы настроены на макс. оптимизацию по размеру кода.
ПС Выводы делайте сами
ППС Сильно не бейте - делал для себя smile.gif
Нажмите для просмотра прикрепленного файла

Спасибо
WHALE
по-моему,вывод адназначный-СV и код сгенерил короче,и удобнее-не надо мудрить с инициализацией битовой структуры-указал bit и усе. smile.gif
freux
В примере указан carry flag, для остальных флагов будет тоже самое:
unsigned char nHalf = 0;
temperature = temperature >> 1;
if (SREG_C == 1)
nHalf = 5;

В опциях компилятора, на закладке Preprocessor, в Defined symbols должно быть ENABLE_BIT_DEFINITIONS

Как обращаться к флагам видно в файле iomacro.h в директории, где установлен IAR \avr\inc
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.