Есть ли модальность для изменения элементов вектора / массива побитно? - PullRequest
1 голос
/ 25 мая 2019

Я настраиваю "симуляцию" RamBlock.Использование статического массива bools в шестнадцатеричном формате (10 элементов), который нужно изменять по отдельности по битам.

uint8_t boolArray[10] = {0x03, 0xED, 0xE8, 0x00, 0xFF, 0x56, 0x01, 0x02, 0xAB, 0x18};

Редактировать: В поле требований указывается функция-прототип:

Std_ReturnType _WriteBoolean(uint8_t ramBlockAddr, uint16_t ramBlockLength, uint16_t byteIndex, uint8_t bitIndex, const uint8_t* value, uint8_t length)

И я могу изменить следующее с помощью параметров: byteIndex, bitIndex, length и value.

Функция будет выглядеть следующим образом:

returnValue = _WriteBoolean((uint8_t*)&boolArray[0], 10, 0, 3, (uint8_t*) &x, 4);
/*Bits should be written with the value provided by "x"*/

Я могу получить доступ к элементамиз boolArray [] через &boolArray[i].Не знаю, как изменить / обновить его с помощью нового значения bool, взятого из функции (returnValue).

Буду признателен за любую помощь, спасибо!

1 Ответ

0 голосов
/ 25 мая 2019

Для включения и выключения определенных битов можно использовать побитовые операции.Например, если у нас есть значение 0x3, то есть 0011 в двоичном формате, чтобы включить третий бит, мы могли бы сделать value |= (1 << 2).Мы сдвигаем содержимое временной константы 1 на две позиции впереди и делаем OR со значением: 0011 |0100 = 0111.

Чтобы немного отключить, мы делаем то же самое, только что мы берем дополнение к константе и делаем AND со значением: value &= ~(1 << 2) => 0111& ~0100 => 0111 & 1011 => 0011

Объединение может также использоваться для представления блока памяти:

typedef union {

    uint_8 data;

    struct {

      uint8_t cell1;
      uint8_t cell2;
      uint8_t cell3;
      uint8_t cell4;
      uint8_t cell5;
      uint8_t cell6;
      uint8_t cell7;
      uint8_t cell8;

   };

} Block_t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...