Как разделить unsigned long int (32 бит) на 8 кусочков?


Извините, если мой вопрос сбивает с толку, но вот пример того, что я хочу сделать,

Допустим, у меня есть unsigned long int = 1265985549 в двоичном коде я могу записать это как 01001011011101010110100000001101

Теперь я хочу разделить это двоичное 32-битное число на 4 бита, как это, и работать отдельно над этими 4 битами

0100 1011 0111 0101 0110 1000 0000 1101

Любая помощь будет признательна.

3 2

3 ответа:

Вы можете получить 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.

short nibble0 = (i >>  0) & 15;
short nibble1 = (i >>  4) & 15;
short nibble2 = (i >>  8) & 15;
short nibble3 = (i >> 12) & 15;

Etc

Основываясь на комментарии, объясняющем фактическое использование этого, вот другой способ подсчитать, сколько кусочков имеют нечетную четность: (не проверено)

; 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 bits "(где "all bits" относится ко всем битам в nibble, а не ко всему целому числу), вторая часть основана на этом алгоритме подсчета бит , пропуская некоторые шаги, которые являются ненужными, потому что некоторые биты всегда равны нулю и поэтому не должны быть добавлен.