Типа bitarray - сдвиг битов

У меня есть система.Коллекции.Массив BitArray (~3000 элементов), и я хотел бы сдвинуть все биты влево на 1. Однако коллекция, похоже, не поддерживает эту операцию (т. е. bitArray

спасибо!

5 ответов


этот простой фрагмент показывает ручной способ сделать это. Значение bitArray[0] перезаписывается:

//... bitArray is the BitArray instance

for (int i = 1; i < bitArray.Count; i++)
{
   bitArray[i - 1] = bitArray[i];
}

bitArray[bitArray.Count - 1] = false // or true, whatever you want to shift in

сделать этот метод расширения не должно быть большой проблемой.


Я не уверен, как насчет эффективности, но этот метод расширения делает работу

public static BitArray ShiftRight(this BitArray instance)
{
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}

самый простой способ, которым я бы пошел с верхней части моей головы, это преобразовать BitArray в BigInt или аналогичную структуру, которая поддерживает побитовое смещение и обратно. Теперь встроенный BigInteger в .Net 4 не поддерживает сдвиг, я думаю, но есть и другие, которые это делают, например, реализация Mono.


воссоздайте bitarray себя как оболочку вокруг ulong[]; реализация bitshifts на число меньше 64 - это кусок пирога, и это займет меньше времени и убьет меньше белых медведей, чем другие предлагаемые подходы. Опасаясь "битов, которые будут падать конца", если вы хотите сохранить их, вам, возможно, придется вырастить массив (или нет, если они равны нулю, и вы говорите, что несуществующий элемент неявно содержит ноль).