/// <summary> /// Скопировать из другого массива бит /// </summary> /// <param name="mba">Массив бит</param> public MyBitArray(MyBitArray mba) { this.length = mba.Length; this.array = new bool[length]; for (int i = 0; i < array.Length; i++) array[i] = mba[i]; }
/// <summary> /// Сравнить массив бит с другим массивом бит /// </summary> /// <param name="mba">Массив бит</param> /// <returns>True если одинаковы, иначе False</returns> public bool Equals(MyBitArray mba) { if (this.Length != mba.Length) return false; for (int i = 0; i < this.Length; i++) if (this[i] != mba[i]) return false; return true; }
/// <summary> /// Циклический сдвиг вправо на <paramref name="count"/> позиций /// </summary> /// <param name="mba">Массив бит</param> /// <param name="count">Количество позиций</param> /// <returns>Циклически сдвинутый вправо массив бит</returns> public static MyBitArray operator >>(MyBitArray mba, int count) { for (int i = 0; i < count; i++) { MyBitArray nmba = new MyBitArray(mba.Length); Copy(mba, 0, ref nmba, 1, mba.Length - 1); nmba[0] = mba[mba.Length-1]; mba = nmba; } return mba; }
/// <summary> /// Копирование из массива бит <paramref name="Source"/> с позиции <paramref name="SourceIndex"/> в массив бит <paramref name="Destination"/> с позиции <paramref name="DestinationIndex"/> <paramref name="Count"/> элементов /// </summary> /// <param name="Source">Источник</param> /// <param name="SourceIndex">Индекс в источнике</param> /// <param name="Destination">Назначение</param> /// <param name="DestinationIndex">Индекс в назначении</param> /// <param name="Count">Количество</param> public static void Copy(MyBitArray Source, int SourceIndex, ref MyBitArray Destination, int DestinationIndex, int Count) { try { if (Destination.Length - DestinationIndex < Count) throw new Exception("Выбранный фрагмент массива не умещается в заданный фрагмент массива."); if (Source.Length - SourceIndex < Count) throw new Exception("Выбранный фрагмент массива меньше указанной длины копирования."); for (int i = SourceIndex; i < Source.Length; i++) if (Count != 0) { Destination[DestinationIndex + i - SourceIndex] = Source[i]; Count--; } else break; } catch (Exception ex) { Console.WriteLine(ex.Message + " @MyBitArrayCopy"); } }
/// <summary> /// Циклический сдвиг вправо на <paramref name="count"/> позиций /// </summary> /// <param name="arr">Массив бит</param> /// <param name="count">Количество позиций</param> /// <returns>Циклически сдвинутый вправо массив бит</returns> public static MyBitArray cicleShiftRight(MyBitArray arr, int count)//>> { for (int c = 0; c < count; c++) { bool temp = arr[arr.Length - 1]; for (int i = arr.Length - 1; i > 0; i--) { arr[i] = arr[i - 1]; } arr[0] = temp; } return arr; }
/// <summary> /// Циклический сдвиг влево на <paramref name="count"/> позиций /// </summary> /// <param name="arr">Массив бит</param> /// <param name="count">Количество позиций</param> /// <returns>Циклически сдвинутый влево массив бит</returns> public static MyBitArray cicleShiftLeft(MyBitArray arr)//<< { MyBitArray B = new MyBitArray(arr); MyBitArray.Copy(arr, 1, ref B, 0, arr.Length - 1); B[B.Length - 1] = arr[0]; return B; }
/// <summary> /// Отрезать с конца <paramref name="Length"/> бит /// </summary> /// <param name="A">Массив бит</param> /// <param name="Length">Количество отрезаемых бит</param> /// <returns>Обрезанный массив бит</returns> public static MyBitArray TrimEnd(MyBitArray A, int Length) { try { if (Length > A.Length) throw new Exception("Длина отреза больше длины самого массива"); if (Length == 0) return A; MyBitArray B = new MyBitArray(A.Length - Length); //Console.WriteLine("{0} {1} {2} {3} {4} @TRIMEND", "A" + A.Length, 0, "B" + B.Length,0, A.Length - Length); MyBitArray.Copy(A, 0, ref B, 0, A.Length - Length); return B; } catch (Exception ex) { Console.WriteLine(ex.Message + " @MyBitArrayTrimEnd"); return new MyBitArray(0); } }
/// <summary> /// Убрать слева незначащие нули /// </summary> /// <param name="A">Массив бит</param> /// <returns>Массив бит</returns> public static MyBitArray TrimStart(MyBitArray A) { try { for (int i = 0; i < A.length; i++) if (A[i]) return TrimStart(A, i); return new MyBitArray(0); } catch (Exception ex) { Console.WriteLine(ex.Message + " @MyBitArrayTrimStart"); return new MyBitArray(0); } }
/// <summary> /// Отрезать с начала <paramref name="Length"/> бит /// </summary> /// <param name="A">Массив бит</param> /// <param name="Length">Количество бит</param> /// <returns>Обрезанный массив</returns> public static MyBitArray TrimStart(MyBitArray A, int Length) { try { if (Length > A.Length) throw new Exception("Длина отреза больше длины самого массива"); if (Length == 0) return A; MyBitArray r = new MyBitArray(A.Length - Length); MyBitArray.Copy(A, Length, ref r, 0, A.Length - Length); return r; } catch (Exception ex) { Console.WriteLine(ex.Message + " @MyBitArrayTrimStart"); return new MyBitArray(0); } }
/// <summary> /// Дописать справа <paramref name="count"/> нулей /// </summary> /// <param name="A">Массив бит</param> /// <param name="count">Количество нулей</param> /// <returns>Дополненный массив бит</returns> public static MyBitArray PadRight(MyBitArray A, int count) { MyBitArray B = new MyBitArray(A.Length + count, false); MyBitArray.Copy(A, 0, ref B, 0, A.Length); return B; }
/// <summary> /// Преобразовать строку в массив бит /// </summary> /// <param name="s">Строка</param> /// <returns>Массив бит</returns> public static MyBitArray FromString(string s) { MyBitArray mba = new MyBitArray(s.Length); for (int i = 0; i < s.Length; i++) mba[i] = s[i] == '1' ? true : false; return mba; }