Разделение 2-байтового числа на два 1-байтовых - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь разбить 2-байтовое число на два 1-байтовых числа.Но я получаю неправильный результат.Предполагаемое число: 0x1234H

uint8_t high = 0;
uint8_t low = 0;

high = static_cast<uint8_t >(val & 0xFF);
low = static_cast<uint8_t >(val >> 8);

cout << std::bitset<8>(high) << endl;
cout << std::bitset<8>(low) << endl;

cout << "high byte: " << static_cast<int >(high) << endl;
cout << "low byte: " << static_cast<int >(low) << endl;

Когда я запускаю код, я ожидаю получить следующий вывод:

0x1234
00001100
00010010
high byte: 12
low byte: 34

И все же вместо этого я получаю,

0x1234
00110100
00010010
high byte: 34
low byte: 12

Почему я терплю неудачу в моей попытке?

1 Ответ

0 голосов
/ 25 февраля 2019

Это потому, что вы неправильно назвали переменные в этих строках ...

high = static_cast<uint8_t >(val & 0xFF);
low = static_cast<uint8_t >(val >> 8);

Оператор >> смещает биты вниз от старших битовых позиций к младшим битовым позициям.Если вам нужно сдвинуть эти биты вниз, чтобы сохранить их (в приведении), это потому, что они изначально не были младшими битами.Итак ...

low = static_cast<uint8_t >(val & 0xFF);
high = static_cast<uint8_t >(val >> 8);

Кстати - побитовый оператор и оператор избыточны, когда вы в любом случае приводите к uint8_t - этого уже достаточно, чтобы отбросить все, кроме младшего байта.Это все еще правильно, просто не обязательно.

...