Изменение одного бита в байтовом массиве
Итак, у меня есть байтовый
массив, представляющий дисплей, подключенный к моему Arduino:
byte theDisplay[8] = {
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
};
Теперь я хочу перевернуть один бит в произвольном положении:
theDisplay[3][6] = 1;
Этот (вероятно) ошибочный метод приводит к следующим ошибкам:
In function 'void setup()':
sketch_sep14c:13:18: error: invalid types 'byte {aka unsigned char}[int]' for array subscript
theDisplay[3][6] = 1;
^
exit status 1
invalid types 'byte {aka unsigned char}[int]' for array subscript
Есть ли простой способ перевернуть один бит, работая с индексами, как показано выше?
@gurkensaas, 👍3
Обсуждение1 ответ
Ошибка возникает из-за того, что вы пытаетесь использовать синтаксис для 2-мерного массива с 1-мерным массивом (поскольку у вас есть массив байтов, а не битов, и микроконтроллер всегда работает хотя бы с одним байтом). Для доступа к отдельным битам необходимо использовать побитовые операторы. Например, это:
theDisplay[3] |= (1 << bitnumber); // для установки бита
theDisplay[3] &= ~(1 << bitnumber); // для очистки бита
при этом
bitnumber-это номер изменяемого бита, отсчитываемый от наименее значащего бита (в двоичном представлении в вашем коде самая правая цифра) до наиболее значащего бита (самая левая цифра).
Если вы хотите знать, что именно это делает, вы можете поискать в Google побитовые операторы в C++.
Способ Arduino-это функция BitSet https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitset/, @Juraj
Спасибо за ваш ответ. Правильно ли я понимаю, что верхний устанавливает бит в 1, а нижний-в 0?, @gurkensaas
Существует также theDisplay[3] ^= (1 << bitnumber);
для переключения бита., @Edgar Bonet
@gurkensaas Да, именно это и означает "настройка" и "очистка"., @Nick Gammon
- Использование массивов, двоичных данных и битового чтения
- Как управлять выводом регистров сдвига по отдельности побитово
- Вывести 2 числа, хранящиеся в 24-битном формате, в десятичном формате.
- нужно сравнить, если байт меньше 80 шестнадцатеричных
- Как разделить двоичные данные, чтобы сформировать два разделенных двоичных данных?
- В MXCHIP IoT DevKit слишком много инициализаторов для unsigned char [0]
- Все ли эти битовые настройки означают одно и то же?
- Как использовать SPI на Arduino?
https://www.arduino.cc/reference/en/ Раздел "Биты и байты", @Juraj
@Juraj Я знал об этом, но я не мог понять, как установить 6-й бит 3-го элемента в массиве равным 1., @gurkensaas