Прошу прощения, если мой вопрос сбивает с толку, но вот пример того, что я хочу сделать.
скажем, у меня есть unsigned long int = 1265985549 в двоичном формате, я могу записать это как 01001011011101010110100000001101
теперь я хочу разбить это двоичное 32-битное число на 4 бита, как это, и работать отдельно с этими 4 битами
0100 1011 0111 0101 0110 1000 0000 1101
любая помощь будет оценена.
Ответ 1 · рейтинг 6 · Sergey Kalinichenko
Вы можете получить 4-битный полубайт в позиции k, используя битовые операции, например:
uint32_t nibble(uint32_t val, int k) {
return (val >> (4*k)) & 0x0F;
}
Теперь вы можете получить отдельные полоски в цикле, например:
uint32_t val = 1265985549;
for (int k = 0; k != 8 ; k++) {
uint32_t n = nibble(val, k);
cout << n << endl;
}
Демонстрация на ideone.
Ответ 3 · рейтинг 1 · harold
Основываясь на комментарии, объясняющем фактическое использование этого, вот другой способ подсчитать, сколько полубайтов имеют нечетную четность: (не проверено)
; compute parities of nibbles
x ^= x >> 2;
x ^= x >> 1;
x &= 0x11111111;
; add the parities
x = (x + (x >> 4)) & 0x0F0F0F0F;
int count = x * 0x01010101 >> 24;
Первая часть - это просто обычный тип вычисления четности "xor all the bit" (где "all bit" относится ко всем битам в полубайте, а не во всем целочисленном), вторая часть основана на этот алгоритм подсчета битов, пропуская некоторые шаги, которые не нужны, потому что некоторые биты всегда равны нулю и поэтому не должны быть добавлены.