Как скопировать два элемента списка в один больший элемент? - PullRequest
0 голосов
/ 25 мая 2020

Вот пример:

У меня есть список элементов uint8_t (это не настоящий код ^^):

List[0] = 0010 1001
List[1] = 0100 0111

И есть один беззнаковый короткий элемент (в два раза больше uint8_t ).

Я хочу, чтобы мой короткий элемент был следующим: 0010 1001 0100 0111

Могу я переместить его вот так:

ShortElement = (unsigned short) UnsignedInt8List[0];

Или мне нужно использовать бинарные настройки для его перемещения?

Спасибо :)

1 Ответ

1 голос
/ 25 мая 2020

Нет, вы не можете просто преобразовать значение. Поскольку unsigned short всегда может представлять значение в uint8_t, значение останется неизменным. Если вы сделаете ShortElement = (unsigned short) UnsignedInt8List[0];, ShortElement будет присвоено значение 0000 0000 0010 1001.

Вы должны использовать побитовые операции для объединения значений:

ShortElement = ((unsigned short) UnsignedInt8List[0] << 8) |
               ((unsigned short) UnsignedInt8List[1] << 0);

Это немного более подробно чем должно быть, но я включил все для ясности. Это может быть эквивалентно записано как:

ShortElement = ((unsigned short) UnsignedInt8List[0] << 8) | UnsignedInt8List[1];

Одно замечание - будьте осторожны с вашими типами. Вам известен размер uint8_t, но вы не знаете, что unsigned short имеет длину ровно 16 бит, вы знаете только, что он должен быть не менее 16 бит, чтобы иметь возможность удерживать диапазон [0, 65535] . Это не проблема для всего, что вы показали, из-за того, что минимум 16 бит, даже часто рекомендуется использовать типы с нефиксированной шириной, где это безопасно и удобно, но об этом следует помнить.


Может показаться заманчивым, но вы должны не использовать указатели для получения значения:

// DO NOT DO THIS, IT IS THE WRONG WAY
ShortElement = *(unsigned short *) &UnsignedInt8List[0];

Не делайте этого, вы получите неправильный результат на многих системах, а на некоторых он может сразу вызвать ошибку sh. Это неопределенное поведение.

...