Как инвертировать полученные данные
- Войдите на сайт для отправки комментариев
Пнд, 03/06/2013 - 21:18
Оцифровываю сигнал и получаю число на пример 700 это в двоичной 1010111100, мне нужно инвертировать двоичный крод -> 0101000011 и передать его уже в десятичной, это 323, через Serial.println на монитор компьютера. Помогите с программой для инверсии.
К сожалению, этот раздел документации не перевели, так что "только оригинал" Arduino - BitwiseXorNot
Не работает(
Только еще один нюанс не забудте. У нас нет типа данных размером в 10 бит. Ближайшие куда влезет наше 700 - двух-байтовое что-то.
А значит, 700, в двоичном у нас будет B0000001010111100
То есть слева оно дополнится нулями. До тех пор, пока вы не инвертнули числа - эти нуля рояля не играют. Но после инвертирования - они станут единицами, и станут "заметны".
Получится B1111110101000011, что в десятчином уже совсем не 323, а 64835 если мы взяли беззнаковый тип, или вообще отрицательное число если знаковый взяли.
Не работает(
Супер. Очень информативно. Ну значит нужно "что-то сделать".
А как сделать чтобы поменять метсами байты, например первый со вторым 5 с 9 и т.д.??
Если же есть желание, инвертировать только "младшие биты", а старшие оставить "как есть".
То тут поможет чтение Arduino - BitwiseAnd
Предположим что нам нужно инвертить только 10-ть бит, а остальные "оставить нулями".
Тогда есть два пути: уже после конвертации обнулять все что старше, с помощью "Bitwise AND (&)"
Либо почитать эту ссылку дальше и всмотрется в оператор "Bitwise XOR (^)" (если проблема с английским - гуглим любой справочник С/C++ и ищем раздел про битовые операторы - это они и есть).
Вообщем XOR как раз и позволяет задать маску по которой будет сделана инвертация, не трогая все остальное
И еще. Поймите простую вещь. Что у вас на мониторе происходит - никто не видите. Так что если "что-то не выходит", до тех пор пока вы детально не опишите - никто вам помочь не сможет.
А как сделать чтобы поменять метсами байты, например первый со вторым 5 с 9 и т.д.??
Видимо вы имели ввиду биты.
Подход простой. Читаем значение 5-того, запоминаем во временную переменную. Потом читаем 9-тый, устанавливаем 5-тый, в значение 9-того. Потому 9-тому, ставим то что запомнили во временную.
Вообщем обычное "поменять местами значение двух переменных". Только вместо присвоения переменных - используем операции астановки/снятия битов.
Отдельные биты читать/ставить - А вот все теми же Arduino - BitwiseAnd
(кстати выше как раз пример, как я сбрасывал в нулю старшие биты, после конвертации).
Вообщем откройте учебник по C/C++ и проштудируйте битовые операции. Не раз и не два пригодится.
Хотя, если покопатесь в документации Arduino - Reference в разделе "Bits and Bytes" сможете найти парочку готовых функций помогалок для установки/чтения битов. Но это, все-таки, лучше делать после того как уже будете уметь через & и | читать/ставить. Потому как 99% примеров и инете найдете именно через "& и |" и их все равно нужно понимать, а "ардуино функции" - только место в памяти занимают. Вообщем они "для чайников" :)
И на всяк, случай, можете еще раз прочитать (даже если читали) Serial.println() | Аппаратная платформа Arduino
Обратите внимание, что .println умеет и в двоичном виде выводить переменные. Может оказатся очень удобно при разбирательствах/осваивании битовых операций.
Спасибо большое разобрался. Только вот какая проблема теперь: делаю XOR z^B111111111111, а при компиляции оно принимает B111111111111 не за число, а за переменную и выдает ошибку, что делать?
Спасибо большое разобрался. Только вот какая проблема теперь: делаю XOR z^B111111111111, а при компиляции оно принимает B111111111111 не за число, а за переменную и выдает ошибку, что делать?
Ну что же вы все время по одним и тем же граблям бегаете? Я же програмист, а не телепат.
Ну покажите код свой (предварительно, прочитав, если не читали, Вставка программного кода в тему/комментарий). Напишите какая именно ошибка.
Ага. Зря наехал. Это мой же пример не компилится (могли бы и скать, что "ваш пример не работает" ;)
Никогда не думал, что дуина не воспринимает бинарные константы больше байта (если взять не 10-ть единиц, а 8-ми - тогда компилится).
Счас придумае что-нибудь.
Я уже придумал, можно просто это число в десятичном виде написать и всё работает)
Спасибо большое разобрался. Только вот какая проблема теперь: делаю XOR z^B111111111111, а при компиляции оно принимает B111111111111 не за число, а за переменную и выдает ошибку, что делать?
Заглянуть в файл "./hardware/arduino/cores/arduino/binary.h" и понять, что определены только B-константы размером не более 8 бит.
Попутно уяснить для себя механизм определения таких констант и сделать пару-тройку-надцать новых определений под свои потребности.
Ага. И винить некого, так и написанно в доке Целочисленные константы | Аппаратная платформа Arduino : "
Ну фиг с ним. Раз для 16-ти ричных такой оговорки нет, значит задатим константу шестнадцатерично 0x3FF
Выводит:
Как и ожидалось.
Но, из принципа, можно все-таки и двоично :) Собрать из двух байтов
Или замиксовать (что-бы 8-мь единиц на глаз не набирать)
или написать
#define B1111111111 1023
и пользоваться "десятибитовой" B-константой.
или написать
#define B1111111111 1023
и пользоваться "десятибитовой" B-константой.
Ну или так. Честно говоря, в голову не приходилое что это через директивы препроцессора сделано.
Всегда считал что это "синтаксис языка", а значит на уровне компиляторо должно быть реализованно.
Ну "будем знать".
или написать
#define B1111111111 1023
и пользоваться "десятибитовой" B-константой.
Ну или так. Честно говоря, в голову не приходилое что это через директивы препроцессора сделано.
Всегда считал что это "синтаксис языка", а значит на уровне компиляторо должно быть реализованно.
Ну "будем знать".
конструкции типа B010101
я только на ардуино форумах увидел...
А я еще в детства привык к HEX, бинарные константы, да еще сделанные через одно место не перевариваю. Но это каждому своё.