Нужен ответ на простенький вопрос.
- Войдите на сайт для отправки комментариев
Чт, 08/06/2017 - 03:20
Как поменять местами байты в двухбайтовом слове. Например 0x52FA, а мне нужно 0xFA52
Как поменять местами байты в двухбайтовом слове. Например 0x52FA, а мне нужно 0xFA52
52FA FA52
Можно и поизящнее скорее всего, но я открыт к критике.
Вариант кода не лучше вышеперечисленого, но все же хорошо знать и его.
Спасибо ответившим)
Вариант кода не лучше вышеперечисленого, но все же хорошо знать и его.
Не подскажите, что делает строчка 6 в коде?
Вот вам еще код. в ОДНУ строчку.
Думаю, что ЕвгенийП меня поймет, просто выглядит красиво, почти как брейнфак! ;)
Для прикола - сразу с проверочной програмкой.
Ну и на асмо-затычке для полноты коллекции :)
Функция принимает 16-битную переменную, переворачивает в ней байты, и отдаёт обратно.
Ну и на асмо-затычке для полноты коллекции :)
а если совместить? без временного регистра на трех XOR? Asm - операция EOR в АВРке.
Ничего не выигрываем, те же три такта, но прикольнее.
---------------------------
Ну и проверочная програмка на все способы:
На асме оказалось на 10 байт толще, чем мой вариант) (на самом деле нет)
Подозреваю, что данный код будет точно как мой самый первый вариант, но мне лень проверять без сериал ридеров и принтов - слишком много править надо)
Для ТСа - изучай битовые операции - это самое низкоуровневое взаимодействие, следовательно малая ресурсоемкость.
454 байта общий вес
444 байта
Аналогично 444 байта:
bargundabal, это потому, что асм-код в функцию завёрнут. Если голяком вставать то меньше будет)
dimax
Неа, 454 байта.
bargundabal, нужно ещё слово "volatile" убрать. Оно создаёт дополнительный код..
Действительно, теперь ровно как моя одна строчка - 444 байта.
Я просто в асме не шарю, поэтому не попробовал, но если честно - асм, как по мне, явно проиграет четырем битовым операциям в одну строку как по читабельности, так и по времени на выдумывание. Хотя последнее зависит от навыка.
Угу теже 444 байта
Тоже 444 байта. Надо пробовать без стандартных конструкций, либо как-то иначе, но почему-то мне кажется, что все варианты компилятор в итоге причесывает к одному знаменателю.
bargundabal, Сразу не сообразил,- но такой код совершенно бесполезно сравнивать, -компилятор моментом выкинет вашу строчку просто потому, что результат не используется. К моему фрагменту это тоже относится. Т.е. всё, что вы насчитали - не действительно. Нужно куда-то вывести результат. Причём если вывести неудачно, то компилятор опять же оптимизирует код, и переделает по-своему. Т.е. например если преобразование будет только одноразовое в другую переменную, то компилятор расчитает ещё на этапе компиляции результат и запишет его в другую переменную, а самой строчки преобразования не будет в программе вообще :) Видимо нужно создать программу, где в эту функцию будут передаваться неоднократно! неизвестные байты, например прочитанные из порта. Тогда копилятор будет вынужден целиком задействовать алгоритм.)
Протестировал, если ошибся в чем - пиши
Без инвертирования, тестовый образец
Инвертирование моим вариантом
ASM
Третий вариант удивил
Вот теперь есть последовательность в результатах
Ну это понятно. В компиляторе встроен анализ на такую ситуацию. А вот по указателям нет такого анализа.
Ну и на асмо-затычке для полноты коллекции :)
а если совместить? без временного регистра на трех XOR? Asm - операция EOR в АВРке.
Ничего не выигрываем, те же три такта, но прикольнее.
---------------------------
Ну и проверочная програмка на все способы:
Красиво! Я тоже благоговею от XOR, но вот такого применения еще не делал
Красиво! Я тоже благоговею от XOR, но вот такого применения еще не делал
Б..га побойтесь! Это олимпиадная задачка по программированию. Причем разогревная.
Я такие больше 30 лет назад решал ради драйва....
Вообще не понял, что это должно быть.
Вообще не понял, что это должно быть.
Компилятор выискивает компинации <<8 и 8>> и компилирует их иначе , чем если это было другое число. Вот я и показал , что бы было если бы не было этого анализа. Это как заточеные под камни бенчмарки в противостоянии Интел и АМД. Так что использование комбинации >>8 выгоднее, так как компилятор "забъет" на сдвиг и тупо перенесет байт.
Ну сдвиг на байт самый распространенный сдвиг, отсюда и низкая потребность в памяти. Я почти уверен, что этот сдвиг в одну команду идет независимо от направления, а сдвиг на 3 - да, внезапность.
Красиво! Я тоже благоговею от XOR, но вот такого применения еще не делал
Б..га побойтесь! Это олимпиадная задачка по программированию. Причем разогревная.
Я такие больше 30 лет назад решал ради драйва....
Знаешь почему на Кавказе водители ездят не по правилам? Они их не учили!
За последние лет 10 за рулём учебных авто я не видел ни одного джигита, не по мужски это!
)))
но решение всё же красивое, это я об эстетике программирования, если такая есть
Точно так же скорее всего компилируется и твой вариант. Я не силен в ссылках, но если перепишешь его под такой же сдвиг - будет интересно увидеть размер кода)