C ++: как поместить соответствующие биты из uint32 в uint8? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть uint32, на котором я пометил некоторые биты:

uint32 i = 0;
i |= (1 << 0);
i |= (1 << 5); 
i |= (1 << 13);
i |= (1 << 19);
...

Я хочу преобразовать его в uint8 (получая состояние первых 8 бит и игнорируя остальные).Очевидно, я мог бы сделать это:

uint8 j = 0;
for (int q = 0; q < 8; q++)
{
    if (i & (1 << q))
    {
        j |= (1 << q);
    }
}

Но есть ли причудливая побитовая операция, которую я могу использовать для передачи битов одним махом без цикла?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы можете достичь того же результата, просто назначив значение uint32 для uint8.

int main()
{
  unsigned int i = 0x00000888;
  unsigned char j = i;
  cout<<hex<<i<<endl;
  cout<<hex<<+j<<endl;
  return 0;
}

вывод: 888 88

0 голосов
/ 05 декабря 2018

Почему бы просто не замаскировать последние 8 бит вместо запуска цикла, чтобы увидеть, установлены ли отдельные биты?

const unsigned char bitMask = 0xFF;
j = (i & bitMask);

Обратите внимание, что C ++ 14 позволяет вам сразу определять двоичные литералы

const unsigned char bitMask = 0b1111'1111;

Выше все, что вам нужно.На всякий случай, если вам нужно получить последующие позиции байтов, используйте ту же маску 0xFF и убедитесь, что результат сдвинут вправо назад, чтобы получить желаемое значение байта.

...