Как читать конкретные биты без знака 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.

Другие вопросы по тегам