Вопрос:
Я пытаюсь извлечь два байта из 16-битного слова и сделать 16-битное слово из двух байтов. Это то, что я пробовал (byte = unsigned char, word = unsigned short):
Разделить слово grpix на 2 байта:
word grpix; // Assume that the value has been initialized byte grpixl = grpix & 0x00FF; byte grpixh = grpix & 0xFF00;
Сделать слово grpix из 2 байтов
byte grpixh; // Assume that the value has been initialized byte grpixl; // Assume that the value has been initialized word grpix = grpixh; grpix <<= 8; grpix += grpixl;
По какой-то причине мой код работает не так, как ожидалось, и теперь я не уверен, что “расщепление” этого слова неверно, если “создание” слова неправильное или оба… Не могли бы вы дать мне совет?
Лучший ответ:
Вы не сдвигаетесь, когда вы разделяете слово. Поэтому, если grpix равен 0x1234, тогда grpixl получает ожидаемый 0x34 но grpixh заканчивается как 0x1200. Ты должен сказать
byte grpixh = grpix >> 8;
Конечно, вы также игнорируете любые опасения, которые могут возникнуть у вас. Вероятно, вы должны преобразовать свое слово к известному endian (с чем-то вроде htons()), прежде чем пытаться разбить (и сделать обратное преобразование при присоединении).
Ответ №1
Узнайте: http://graphics.stanford.edu/~seander/bithacks.html для выполнения всех операций.
right_byte = short_val & 0xFF; left_byte = ( short_val >> 8 ) & 0xFF short_val = ( ( left_byte & 0xFF ) << 8 ) | ( right_byte & 0xFF );
Я всегда делаю маску & 0xFF, чтобы гарантировать, что у меня нет проблем с знаками.
Ответ №2
Когда вы маскируете старший байт, вам также нужно сдвинуть его на 8 бит, иначе вы просто получите 16-битное число с очищенными нижними восемью битами.
byte grpixh = (grpix & 0xFF00) >> 8
Кроме того, ваша композиция может быть более эффективной, используя or-equals вместо плюсов:
grpix | = grpixh << 8
Ответ №3
Простой код, который я использую для решения этой проблемы:
word=(msb<<8)+lsb;