Младший младший бит дается простым маскированием с битовой маской: input[i] & 0xFF
.
Код, который вы отправили input[i] >> 8
, дает следующий байт перед этим.Тем не менее, он также дает все, что было сохранено в старших байтах, в случае, если int
равен 32 битам.Итак, снова вам нужно замаскировать, (input[i] >> 8) & 0xFF
.
Также избегайте сдвига битов на типах со знаком, таких как int
, потому что, если они имеют отрицательные значения, вы вызываете плохо определенное поведение, которое приводит к ошибкам.
Правильный способ маскировать отдельные байты int
заключается в следующем:
// 16 bit system
uint8_t bytes [sizeof(int)] =
{
((uint16_t)i >> 0) & 0xFF, // shift by 0 not needed, of course, just stylistic
((uint16_t)i >> 8) & 0xFF,
};
// 32 bit system
uint8_t bytes [sizeof(int)] =
{
((uint32_t)i >> 0) & 0xFF,
((uint32_t)i >> 8) & 0xFF,
((uint32_t)i >> 16) & 0xFF,
((uint32_t)i >> 24) & 0xFF,
};
Это помещает младший бит в индекс 0 в этом массиве, аналогично представлению Little Endian в памяти.Тем не менее, обратите внимание, что фактический битовый сдвиг не зависит от порядка байтов и также является быстрым, поэтому это превосходный метод.
Решения, основанные на объединениях или арифметике указателей, зависят от порядка байтов и часто содержат ошибки (нарушения псевдонимов указателей)поэтому их следует избегать, поскольку их использование бесполезно.