Самый эффективный способ преобразовать два байта в 16-битное значение?

Скажите первый байт = 2 (декабрь) и второй байт = 1 (декабрь).

Следовательно, первый байт представляет 257 (dec).
Следовательно, второй байт представляет 1 (dec).

Таким образом, (общее) 16-битное значение составляет 258 (декабрь).

Так что если я сделаю:

  (byte1*256)+byte2

Это «правильный» способ сделать это? Или есть лучший способ?

Спасибо,
Т.

1

Решение

В большинстве современных оптимизаторов не существует «правильного» способа сделать это: ваш код будет преобразован во все, что быстрее в вашей системе, что может включать

  • Загрузка байтов отдельно в нижний и верхний частичные регистры — преобразование не происходит, байты загружаются непосредственно на свои места.
  • Смещение битов старшего байта и ИЛИ в нижнем байте — что-то вроде byte1<<8 | byte2
  • Бит сдвигает верхний байт и добавляет младший байт — так же, как указано выше, за исключением + вместо |
  • Что-то совершенно другое, что быстро работает в вашей системе — Различные архитектуры могут иметь специфичные для архитектуры оптимизации, не описанные выше.

В своем исходном коде вы должны сконцентрироваться на разъяснении ваших намерений читателям: если оно умножается на 256 это имеет смысл для ваших читателей, а затем использовать умножение; если это битовое смещение, используйте битовое смещение. Компилятор позаботится о том, чтобы сделать ваш код максимально эффективным.

4

Другие решения

Это должно работать:

(byte1<<8) | byte2

Но я думаю, что здесь может быть подвох. Если твой byte1 а также byte2 Типы данных имеют размер всего 1 байт (то есть 8 бит), поэтому смещение, вероятно, не поможет.

Я думаю, то, как ты это сделал, должно быть совершенно нормально. Однако, для ударов что-то вроде этого, вероятно, также будет работать:

int16 total = byte1;
total = (total<<8) | byte2
1

Вы можете использовать оператор сдвига, который сдвигает биты:
(Байт 1 << 8) + byte2

Сдвиг влево такой же, как умножение на степени 2. В приведенном выше примере

(2 << 8) совпадает с (0b 0000 0010 << 8) который является (0b 10 0000 0000).

Мы сдвигаемся на 8, потому что в байте 8 бит.

0