Как разделить unsigned long int (32 бит) на 8 кусочков?
Извините, если мой вопрос сбивает с толку, но вот пример того, что я хочу сделать,
Допустим, у меня есть unsigned long int = 1265985549 в двоичном коде я могу записать это как 01001011011101010110100000001101
Теперь я хочу разделить это двоичное 32-битное число на 4 бита, как это, и работать отдельно над этими 4 битами
0100 1011 0111 0101 0110 1000 0000 1101
Любая помощь будет признательна.
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; }
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, а не ко всему целому числу), вторая часть основана на этом алгоритме подсчета бит , пропуская некоторые шаги, которые являются ненужными, потому что некоторые биты всегда равны нулю и поэтому не должны быть добавлен.