Данные нестандартного типа в union ?

Mikhailo21
Offline
Зарегистрирован: 12.05.2017

Возможно ли компактно упаковать массив 11-битных данных при помощи структуры union, чтобы не тратить  на каждый элемент массива 16 бит и не мудрить с расчетом сдвига  битов,  которые могут в некоторых случаях  распределяться  на 3 соседних байта  ?

union buff {
byte buff_a[SIZE_A];
uint11_type buff_b [];
};

 

PS: тип  "uint11_type" мое желание, но пока реального способа не нашел

Еще думал сделать массив по типу сдвигового регистра, но  наверное сдвигать весь массив очень медленно ...    Если нельзя формализовать через union, подскажите пожалуйста оптимальный путь по скорости выполнения.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Видео:Полтора землекопа.https://www.youtube.com/watch?v=zr3YuhgpuYg

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Думаю, qwone прав и с точки зрения как объема кода и данных, так и скорости выполнеия будет наилучшим решением работать с 12-битными данными (2 элемента данных в 3 байтах).

SQwix
Offline
Зарегистрирован: 12.05.2017

Mikhailo21 пишет:
Возможно ли компактно упаковать массив 11-битных данных при помощи структуры union, чтобы не тратить  на каждый элемент массива 16 бит и не мудрить с расчетом сдвига  битов

C битами ничего хорошего не получится, минимальный размер ячейки в 8 разрядном контроллере 8 бит и каждый бит упаковывается в байт:

typedef   struct { boolean a[11];} ELEVEN_BITS;
byte one_byte;
boolean one_bit;
union  {ELEVEN_BITS eb[10]; byte b[];} buffer; 

void setup () 
{
  Serial.begin(115200);
   Serial.print("sizeof one_bit "); Serial.println(sizeof(one_bit));
  Serial.print("sizeof one_byte ");  Serial.println(sizeof(one_byte));
  Serial.print("sizeof ELEVEN_BITS "); Serial.println(sizeof(ELEVEN_BITS) );
  Serial.print("sizeof buffer.eb "); Serial.println(sizeof(buffer.eb) );
  Serial.print("sizeof buffer "); Serial.println(sizeof(buffer) );
 }
void loop () {}

 

 

negavoid
Offline
Зарегистрирован: 09.07.2016

С битами всё получится, если делать, как сказано в #2, а не как в #3 :)

Mikhailo21
Offline
Зарегистрирован: 12.05.2017

negavoid пишет:
С битами всё получится, если делать, как сказано в #2, а не как в #3 :)

Как конкретно делать ?

negavoid
Offline
Зарегистрирован: 09.07.2016
typedef struct {
  byte first_bits;
  byte second_bits;
  byte third_bits;
} two_packed_values;

но сдвигать биты для работы с ними всё равно придётся