Я пытаюсь найти более быстрый подход к следующей проблеме.
У меня есть 2 массива int, представляющих биты, вот пример 8-позиционного
int[] intArray1 = new[] {1, 1, 1, 0, 1, 1, 0, 1};
int[] intArray2 = new[] {0, 1, 0, 0, 1, 0, 0, 1};
Количество бит в массивах может быть 8, 32, 64 и 64+.
Таким образом, я должен иметь возможность создать алгоритм, который обрабатывает любой тип ввода, сдвигает биты для каждого и применяет логические операции между обоими массивами наиболее быстрым способом.
После небольшого исследования я подумал о преобразовании массива int в массив bool и создании BitArray с использованием массива bool, потому что BitArray имеет конструктор, который поддерживает bools как биты, и имеет встроенные побитовые операции.
bool[] boolArray = intArray.Select(s => s.Equals(1)).ToArray();
BitArray bitArray = new BitArray(boolArray);
Однако он не поддерживает встроенный битовый сдвиг, его нужно выполнять итеративно, теряя всю точку производительности, которую я пытаюсь достичь.
Я мог бы использовать int32 и int64, но это решение не будет работать для размеров более 64 бит.
С уважением
Почему бы просто не использовать BigInteger
?
Вы можете использовать этот метод для преобразования string
в BigInteger
:
public static BigInteger BinToDec(string value)
{
// BigInteger can be found in the System.Numerics dll
BigInteger res = 0;
// I'm totally skipping error handling here
foreach(char c in value)
{
res <<= 1;
res += c == '1' ? 1 : 0;
}
return res;
}
Или, если вы хотите придерживаться своего массива int
и преобразовать его в BigInteger
:
public static BigInteger BitArrayToBigDecimal(int[] bitIntArr) {
// BigInteger can be found in the System.Numerics dll
BigInteger res = 0;
// I'm totally skipping error handling here
foreach(int i in bitIntArr) {
res <<= 1;
res += i == 1 ? 1 : 0;
}
return res;
}
Их тоже можно немного сдвинуть. Как это:
var foo = BinToDec("11101101");
BigInteger fooShifted = foo >> 4;
var bar = BitArrayToBigDecimal(new[] {1, 1, 1, 0, 1, 1, 0, 1});
BigInteger barShifted = bar >> 4;
Дайте знать, если у вас появятся вопросы.
ему нужно обрабатывать более 64-битные входы, biginteger - 64 бита
@MrVoid BigInteger
динамично растет. Из Документы MSDN: BigInteger
«Представляет произвольно большое целое число со знаком». Теоретически он может быть бесконечно большим, но он ограничен размером объекта .NET (около 2 ГБ).
BitArray довольно неуклюжий. По уважительной причине, это также непросто сделать эффективным для процессора. Он теряет 64 бита, и только ассемблерный код может сделать его лучше, который не может быть сгенерирован с помощью MSIL. Просто погуглите "C# bitarray shift" для обращений, сомнительно, что они будут сильно отличаться от того, что у вас есть.