Как читать конкретные биты без знака int
У меня есть uint8_t, и мне нужно для чтения / записи в конкретные биты. Как бы я поступил так? В частности, я имею в виду, что мне нужно записать, а затем прочитать первые 7 битов для одного значения и последний бит для другого значения.
редактировать: забыл указать, я буду устанавливать их как big endian
1 ответ
Вы ищете для маскировки. Изучение, как использовать побитовые операторы C: ~
, |
, &
, ^
и так далее, будет огромная помощь, и я рекомендую вам посмотреть их.
В противном случае - хотите прочитать наименее значимый бит?
uint8_t i = 0x03;
uint8_t j = i & 1; // j is now 1, since i is odd (LSB set)
и установить это?
uint8_t i = 0x02;
uint8_t j = 0x01;
i |= (j & 1); // get LSB only of j; i is now 0x03
Хотите установить семь старших значащих битов i на семь старших значащих бит j?
uint8_t j = 24; // or whatever value
uint8_t i = j & ~(1); // in other words, the inverse of 1, or all bits but 1 set
Хотите прочитать эти биты я?
i & ~(1);
Хотите прочитать Nth (индексирование с нуля, где 0 - младший бит) бита i?
i & (1 << N);
и установить это?
i |= (1 << N); // or-equals; no effect if bit is already set
Эти трюки пригодятся вам, когда вы изучите C.