Итак, битовые поля. В частности, большие битовые поля. Я понимаю, как манипулировать отдельными значениями в битовом поле, но как бы я делал это на большом наборе, например, скажем:
uint[] bitfield = new uint[4] { 0x0080000, 0x00FA3020, 0x00C8000, 0x0FF00D0 };
Конкретная проблема, с которой я столкнулся, - это сдвиги влево и вправо, которые пронизывают весь массив. Так, например, если бы я сделал >> 4
в массиве выше, я бы в итоге получил:
uint[4] { 0x0008000, 0x000FA302, 0x000C800, 0x00FF00D };
Теперь (чрезмерно) упрощенный алгоритм здесь может выглядеть примерно так (это я пишу код на лету):
int shift = 4;
for (int i = 0; i <= shift; i++) {
for (int j = bitfield.GetUpperBound(0); j > 0; j--) {
bitfield[j] = bitfield[j] >> 1;
bitfield[j] = bitfield[j] + ((bitfield[j-1] & 1) << (sizeof(uint)*8));
}
bitfield[0] = bitfield[0] >> 1;
}
Есть ли что-то встроенное, что может облегчить работу с данными такого рода?