|
|
  |
Перестановка битов в байте., реализация на C (CVAVR) |
|
|
|
Aug 27 2006, 19:47
|

Мастер
   
Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474

|
Цитата(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-го посмотреть надо. О том, где можно найти книгу, здесь.
Сообщение отредактировал Edmundo - Aug 27 2006, 19:55
--------------------
شامل
|
|
|
|
|
Aug 27 2006, 20:11
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(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
|
|
|
|
|
Aug 28 2006, 09:43
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
Цитата(singlskv @ Aug 28 2006, 12:06)  Цитата(IgorKossak @ Aug 28 2006, 11:53)  Цитата(vet @ Aug 28 2006, 08:41)  singlskv, CodeVision активно использует бит Т в битовых операциях.
IAR тоже. А можно какой-нибудь пример кода? Вот проводил недавно для себя небольшое исследование. Компиляторы настроены на макс. оптимизацию по размеру кода. ПС Выводы делайте сами ППС Сильно не бейте - делал для себя
CV_vs_IAR_________________.rar ( 1.35 килобайт )
Кол-во скачиваний: 154
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
Aug 28 2006, 10:02
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(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 тоже. А можно какой-нибудь пример кода? Вот проводил недавно для себя небольшое исследование. Компиляторы настроены на макс. оптимизацию по размеру кода. ПС Выводы делайте сами ППС Сильно не бейте - делал для себя
CV_vs_IAR_________________.rar ( 1.35 килобайт )
Кол-во скачиваний: 154Спасибо
|
|
|
|
|
Aug 28 2006, 15:37
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 7-02-05
Пользователь №: 2 473

|
В примере указан 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|