Изменение одного бита в байтовом массиве

Итак, у меня есть байтовыймассив, представляющий дисплей, подключенный к моему 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

Есть ли простой способ перевернуть один бит, работая с индексами, как показано выше?

, 👍3

Обсуждение

https://www.arduino.cc/reference/en/ Раздел "Биты и байты", @Juraj

@Juraj Я знал об этом, но я не мог понять, как установить 6-й бит 3-го элемента в массиве равным 1., @gurkensaas


1 ответ


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