Данные нестандартного типа в union ?
- Войдите на сайт для отправки комментариев
Пт, 12/05/2017 - 22:21
Возможно ли компактно упаковать массив 11-битных данных при помощи структуры union, чтобы не тратить на каждый элемент массива 16 бит и не мудрить с расчетом сдвига битов, которые могут в некоторых случаях распределяться на 3 соседних байта ?
union buff {
byte buff_a[SIZE_A];
uint11_type buff_b [];
};
PS: тип "uint11_type" мое желание, но пока реального способа не нашел
Еще думал сделать массив по типу сдвигового регистра, но наверное сдвигать весь массив очень медленно ... Если нельзя формализовать через union, подскажите пожалуйста оптимальный путь по скорости выполнения.
Видео:Полтора землекопа.https://www.youtube.com/watch?v=zr3YuhgpuYg
Думаю, qwone прав и с точки зрения как объема кода и данных, так и скорости выполнеия будет наилучшим решением работать с 12-битными данными (2 элемента данных в 3 байтах).
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 () {}С битами всё получится, если делать, как сказано в #2, а не как в #3 :)
Как конкретно делать ?
typedef struct { byte first_bits; byte second_bits; byte third_bits; } two_packed_values;но сдвигать биты для работы с ними всё равно придётся