Как разбить число на биты и записать его в массив в си?

есть число, к примеру 100000 или 186a0 в hex. Это двоичное число состоящие из 17 знаков, а значит поместится в 3 байтовый массив. Вопрос в том, как это число правильно распихвать по этим 3 байтам массива. Я пробова переводить число в hex через sprintf, разбивал получившуюсь строку на подстроки по 2 элемента и с помощью atoi присваивал переведенное в число значение этих под строк в байты массива. Но это неправильный подход. Это нужно, для того, чтоб отправить значение по проторколу WS и его можно было расшифровать с помощью поитовых операций. Подскажите пожалуйста, как это сделать


Ответы (1 шт):

Автор решения: Slavik

с помощью поразрядных операций
например, извлечь самый младший разряд можно с помощью логического умножения

int i = 5;   // 101b
int s = 0x1; // 001b
bool bit = i & s;   // 101b & 0x1h = 101b & 001b = 001

затем сдвигаешь s на один разряд влево и повторяешь операцию - получишь следующий разряд:

s <<= 1;    // s = 001b << 1 = 010b
bit = i & s; // bit = 101b & 010b = 0

и так далее


ну помещаешь в цикл, итераций должно быть столько же , сколько и разрядов занимает число типа int:

int intSizeInBits = sizeof(int) << 3;
for(int i = intSizeInBits ; i > 0; i--)


ну разделить число на байты тоже очень просто - с помощью всё того же логического умножения:

int n = 254; // 11111110b;
int s = 0xff; // 11111111b
char byte = n & s;  // byte = 11111110b & 11111111b = 11111110b;

аналогичным образом извлекааешь остальные байты, только теперь сдвигаешь число s на восемь разрядов:

s <<= 8;
→ Ссылка