| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Перевернуть байт (поменять биты местами) |
| Автор: cardinal 26.1.2010, 21:29 | ||||||||
то есть есть строка
А потом везде в программе она используется так
То есть присваивается значение 0b10000000, а мне нужно прописать обратный порядок битов, то есть 0b00000001 (так для любого значения). То есть что-нибудь типа
ищу, чтобы я как и раньше писал
а присваивалось значение 0x01... Подскажите плиз... |
| Автор: comcon1 26.1.2010, 21:40 |
| чисто на уровне препроцессора не Знаю, но там есть операции в 3-4 действия. http://www-graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious |
| Автор: Alexeis 26.1.2010, 21:41 | ||
Циклический сдвиг битов типа такого?
|
| Автор: cardinal 26.1.2010, 22:00 | ||
Это не изменит порядок битов... comcon1, спасибо, на я поковырявшись нашел такой прикольный вариант:
Добавлено через 3 минуты и 25 секунд Осталось додумать как это в данном случае (с портом P2) в define добавить... |
| Автор: 17dufa 27.1.2010, 12:38 |
| cardinal, боюсь что оставить запись в виде Port = 0x80; можно единственным образом - создать класс для порта и перегрузить оператор =, но подозреваю что Ваш компилятор такое не потянет. |
| Автор: xvr 27.1.2010, 13:18 |
| Если компилятор плюсовый, то можно через метапрограмирование (template'ы). Будет чисто compile-time конструкция |
| Автор: NewDima 27.1.2010, 17:18 |
| xvr, |
| Автор: xvr 27.1.2010, 21:18 | ||
|
| Автор: cardinal 27.1.2010, 21:58 | ||||
Да, я тоже думаю, что самый простой вариант это прошариться по программе и везде заменить
на
То есть ничего элегантного с помощью define пока не получается... |
| Автор: xvr 27.1.2010, 22:01 | ||
С define не получится, а с классом с перегруженным оператором operator= получится (это если С++) |
| Автор: cardinal 27.1.2010, 22:08 |
| А я пока не уверен надо ли это... То есть из-за такой ерунды на данном этапе разработки такую хреновину городить |
| Автор: NewDima 28.1.2010, 07:26 |
| xvr, это я понял (я про код), но как использовать это в рли lvalue? |
| Автор: xvr 28.1.2010, 10:41 | ||||
Для этого нужен другой класс (17dufa уже озвучивал)
|
| Автор: NewDima 28.1.2010, 11:14 |
| xvr, ну с перегрузкой оператора то и так ясно, я подумал, может что другое =) |
| Автор: serg76 1.2.2010, 14:07 | ||
или в цикл |
| Автор: cardinal 1.2.2010, 21:12 |
| serg76, если честно не очень понимаю, что делает этот код... |
| Автор: xvr 1.2.2010, 21:32 | ||
Это 'код' разворачивает побитно переменную 'i' в переменную 'b'. Делает он это на ассемблере единственного реально существующего в мире процессора, так что все поголовно должны знать его ассемблер как 'отче наш' С исходным вопросом он конечно не имеет ничего общего, но зато 'ассемблер - это круто!' |
| Автор: mes 1.2.2010, 21:51 |
там скрыто используется флаг. Если не ошибаюсь, получается два (круговых) стека, итерационо с одного справа сбрасывается бит во флаг, и с флага запихивается слева в другой, (а с другого опять через флаг в первый, но это уже вне задания) Т.е. после проведения операции оба байта будут содержать "зеркальное представление" другого, хотя для законченности не хватает в конце еще одной инструкции rcr i,1 Добавлено через 46 секунд |
| Автор: cardinal 1.2.2010, 23:48 |
А тогда ясно. Я просто подумал что чисто командами там муть написана Добавлено через 40 секунд xvr, заметь что про флаг ты ничего не сказал (и наверно даже не подозревал) |
| Автор: cardinal 2.2.2010, 01:51 |
Ничего очевидного тут нет. Да и вообще у меня MSP430 мк, у которого хрен знает какие команды и уж тем более, как там дело обстоит с флагами. То есть пока использование в моем случае под вопросом (руки пока не доходят проверить). Сишными командами думаю все таки решить, есть одна идейка... |
| Автор: mes 2.2.2010, 02:53 |
очевидно тем, кто имел дело с асмом так же как Си`шникам конструкция i+=5; - с ходу и не понятно чем она ставит в тупик остальных ну про перестановку вроде бы Вы нашли решение (и даже не одно) , а в чем сейчас загвоздка ? нельзя ли мини пример ? чтоб понять, что из чего должно получиться .. |
| Автор: serg76 2.2.2010, 10:39 | ||||
да с http://msl.gaw.ru/html.cgi/txt/doc/micros/msp430/asm/start.htm совсем плохо
код был написан на СВ6 имхо судя по командам проще биты по условию выставлять |
| Автор: cardinal 2.2.2010, 20:53 |
Нет времени, с железом разбираюсь Я через недельку отвечу, т.к. тогда новое железо будет готово и я перейду к программированию... |
| Автор: cardinal 12.2.2010, 01:56 |
Итак пример из жизни. Есть два чипа, которые обмениваются информацией при помощи одного порта (8 бит). Но вот незадача - соединения идут крест на крест если посадить оба чипа одной стороне платы. Есть три решения: развести крест на крест (меняя сторону), посадить элементы на разные стороны платы или просто развернуть порядок битов в софте. Я выбрал третье решение, т.к. крест на крест это несуперское решение (общее правило: избегать перекрещивание для того, чтобы сигналы друг друга не портили), а если сажать чипы на разные стороны, то это геморр при сборке платы. |
| Автор: mes 12.2.2010, 20:36 | ||
как я понял у каждого чипа своя копия софта?. тогда делаете макрос типа SEND(value) и для софта каждого чипа определяете его нужным образом. тoгда не возникнет проблем и в дальнейшем , если вдруг вместо реверсного представления битов придется использовать некое другое (например если вынуждены будете пользовать другую развертку соединения чипов). Вместо макроса можно использовать функцию - вынести ее определения в разные файлы и для каждого чипа подключать нужный. P.S. в любом случае естественно придется полазить в проге и заменить все старые операции на новый макрос.. |
| Автор: cardinal 13.2.2010, 00:30 | ||
Нет у одного из чипов софт не поменять. Я решил функцию сделать...
Да, это я как раз с сделал. Все завелось с пол оборота. |