Как разбить число на биты и записать его в массив в си?
есть число, к примеру 100000 или 186a0 в hex. Это двоичное число состоящие из 17 знаков, а значит поместится в 3 байтовый массив. Вопрос в том, как это число правильно распихвать по этим 3 байтам массива. Я пробова переводить число в hex через sprintf, разбивал получившуюсь строку на подстроки по 2 элемента и с помощью atoi присваивал переведенное в число значение этих под строк в байты массива. Но это неправильный подход. Это нужно, для того, чтоб отправить значение по проторколу WS и его можно было расшифровать с помощью поитовых операций. Подскажите пожалуйста, как это сделать
Ответы (1 шт):
с помощью поразрядных операций
например, извлечь самый младший разряд можно с помощью логического умножения
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;