BitArray - сдвиг бит
У меня есть массив System.Collections.BitArray (~3000 элементов), и я хотел бы сдвинуть все биты влево на 1. Однако коллекция, кажется, не поддерживает эту операцию (то есть bitArray << 1 не работает, и там это не метод). Есть идеи, как это сделать?
Спасибо!
6 ответов
Этот простой фрагмент показывает ручной способ сделать это. Значение 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());
}
System.Numerics.BigInteger действительно поддерживает сдвиг битов.
Воссоздайте себя как обертку ulong[]
; реализация битовых сдвигов на число меньше 64 - это очень просто, и это займет меньше времени и убьет меньше белых медведей, чем другие предложенные подходы. Опасаясь "битов, которые выпали бы из конца", если вы хотите сохранить их, вам, возможно, придется увеличивать массив (или нет, если они равны нулю, и вы говорите, что несуществующий элемент неявно удерживает ноль).
Начиная с Core 2.0 (через 7 лет после того, как был задан этот вопрос) есть встроенный метод
.LeftShift()
для этого
Самый простой способ, который я бы выбрал, - конвертировать BitArray в BigInt или аналогичную структуру, которая поддерживает сдвиг по битам и обратно. Теперь встроенный BigInteger в. Net 4 не поддерживает сдвиг, я думаю, но есть и другие, которые поддерживают, например, реализацию Mono.