Побитовое чтение из двухбайтного числа и перестановка байтов местами
- Войдите на сайт для отправки комментариев
Пнд, 06/07/2020 - 23:54
Начал делать чтение первого байта из числа, но получается ерунда на выводе. Случайно получилось, что младший байт считывается, хотя возможно это случайность. Не понимаю как в цикле с одной итерацией может считаться сразу 8 бит... Может чего подскажите, как правильно считать, сохранить, а потом собрать в один uint16_t ?
void setup() { Serial.begin(9600); } void loop() { uint8_t Byte_1; uint16_t B = 65500; for(uint8_t i = 0; i < 1; i++){ Byte_1 += (B << i); } Serial.println(B, BIN); Serial.println(Byte_1, BIN); }
В целом задача поменять местами байты в двухбайтовом числе, используя битовые операции/ используя указатели.
Может для начала в битовых операциях использовать двоичные данные (что для понимания проще, да и, наверное, лучше)?
А дальше по классике, представление, маска и так далее. Ну мне в 10м формате даже код не особо понятен, а самому пересчитывать лень.
Когда я делал так, результат получился тот же самый)
не слушай его, маядеточка, всё в одну строчку делается.
uint16_t src = 65530;
uint16_t swapped = (src<<8) | (src>>8);
не слушай его, маядеточка, всё в одну строчку делается.
uint16_t src = 65530;
uint16_t swapped = (src<<8) | (src>>8);
А биты в байте перевернуть так же смогёшь? ;)
По поводу битовых операций - в своё время наткнулся на отличную статью: https://graphics.stanford.edu/~seander/bithacks.html Там есть ВСЁ, и ещё чуть-чуть. Рекомендую.
DIYMan, отличный материал! Только давать его ТС (который путает биты и байты) - это жирный троллинг :-)
А биты в байте перевернуть так же смогёшь? ;)
в одну строчку - нет, не смогу.
А биты в байте перевернуть так же смогёшь? ;)
я где-то в форуме уже выкладывал этот код, только найти не могу :)
Спасибо за помощь! Не сочтите за наглость, а как тоже самое с помощью указателей сделать? :-)
Спасибо за помощь! Не сочтите за наглость, а как тоже самое с помощью указателей сделать? :-)
А это в лекциях посмотри, у тебя записано должно быть
Спасибо за помощь! Не сочтите за наглость, а как тоже самое с помощью указателей сделать? :-)
Филин, ты ж видишь, задание учебное. Зачем потакаешь ленивой жопе?
Филин, ты ж видишь, задание учебное.
сам учусь :)
сноси :)
Это не учеба. Это для работы.
На форуме я давно, но не пользовался побитовыми операциями в своих скетчах и указателями тоже. И вообще в основном Python изучал.
Это не учеба. Это для работы.
На форуме я давно, но не пользовался побитовыми операциями в своих скетчах и указателями тоже. И вообще в основном Python изучал.
вот теперь бери Кернигана и Ритчи и изучай Си "для работы".
сноси :)
У мня прав нет.
У мня прав нет.
убрал под спойлер. Там кода-то пара строк, даже если это учебное задание - этого явно будет мало, так что ТС придется и своей головой поработать
Спасибо!
Вопрос по поводу этой строчки: uint8_t* ptr_H = (uint8_t*) &B;
что значит запись (uint8_t*) ?
uint8_t* ptr_L = ptr_H + 1; Что дает прибавление единицы к указателю, в котором хранится адрес начала байта?
что значит запись (uint8_t*) ?
приведение типа от указателя на uint16_t к типу "указатель на uint8_t"
очевидно, адрес следующего байта :)
ЗЫ В последнем ответе есть неточность, какая - найдите сами, а то я и правда вам все разжевываю, даж неприлично
Спасибо!
Вопрос по поводу этой строчки: uint8_t* ptr_H = (uint8_t*) &B;
что значит запись (uint8_t*) ?
uint8_t* ptr_L = ptr_H + 1; Что дает прибавление единицы к указателю, в котором хранится адрес начала байта?
в библии по Си есть ответы на этот и многие другие вопросы. Если действительно для работы надо, а не "завтра здавать", думаю, разберёсси.
Спасибо, нашел неточность. Только вчера начал разбираться с побитовыми операциями и указателями :)
Еще вопрос по этой записи: B2 = (*ptr_H << 8 ) | *ptr_L; если бы стоял плюс, то все понятно, но тут стоит или.
Если исходить из такого примера:
то в моем случае в результате должно получиться не перестановка местами байтов, а заполнение единицами.
В оригинале 1111111111011100
При сохранении в B2 = 11011100 | 11111111 получится 1111111111111111 разве нет?
При сохранении в B2 = 11011100 | 11111111 получится 1111111111111111 разве нет?
При сохранении в B2 = 11011100 | 11111111 получится 1111111111111111 разве нет?
Наверное я не так выразился. Вот скетч, он работает и делает то, что надо, благодаря вашим подсказкам )
Вот что получается на выводе:
Оригинальное значение: 1111111111011100
Птваюмать. Мы тебе весь первый курс программирования пересказывать будем?
не бит, а байт. Старший байт слева.
Я начиная думать. что Дед был прав, когда предлагал вам не давать готового, а гнать ссаными тряпками в библиотеку за учебниками. По мере продвижения по теме все очевиднее становится. что думать самостоятельно вы не хотите, иначе не задавали бы вопросов. ответы на которые очевидны из кода
не бит, а байт.
Так то, что ТС не видит разницы было очевидно ещё утром (см. мой пост #7). А собсна чё мы хотим, он же честно признался:
в основном Python изучал.
Хотя, судя по плавающим отступам в коде, насчёт питона он пошутил. Там так не пишут :-)
Так то, что ТС не видит разницы было очевидно ещё утром (см. мой пост #7). А собсна чё мы хотим, он же честно признался:
в основном Python изучал.
Некоторые на Python баллон катят? Или я чот не понял???!!! Может укажешь чё получше из современного и ПОПУлярного? ;))) Все, что придумывают специалисты по языкам - в течении года оказывается в Питоне, ты ж не станешь спорить? И каша не получается, удается сохранить некую логику. В отличии от JS, куда тоже напихано всё что родила научная мысль, но там уже нет начальной концепции... просто каша из всего, где про топор забыли. Как-то так.
Но фраза "Питон изучал" сделала мой день. Я когда только прочитал - думал простебаться в ответ.... ну к примеру попросив построить какое-нить простенькое замыкание... ну чуть сложнее "умножить на 5". Ну раз уж человек столько лет Питон изучал... Потом лень стало.
Некоторые на Python баллон катят?
А чё, последнюю фразу поста ниасилил дочитать? :-)))
Это баллон не на питон, а на 20 языков на уровне выше университетского :-)