Типа 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 - это кусок пирога, и это займет меньше времени и убьет меньше белых медведей, чем другие предлагаемые подходы. Опасаясь "битов, которые будут падать конца", если вы хотите сохранить их, вам, возможно, придется вырастить массив (или нет, если они равны нулю, и вы говорите, что несуществующий элемент неявно содержит ноль).