Как управлять и манипулировать чрезвычайно большими двоичными значениями - PullRequest
0 голосов
/ 04 февраля 2012

Мне нужно прочитать пару очень больших строк, которые состоят из двоичных цифр.Эти строки могут быть очень большими (до 100 000 цифр), которые мне нужно хранить, иметь возможность манипулировать (переворачивать биты) и складывать их вместе.Сначала я разбил строку на 8-символьные куски, преобразовал их в байты и сохранил их в массиве.Это позволило бы мне сравнительно легко переворачивать биты, учитывая индекс бита, который необходимо перевернуть, но при таком подходе я не уверен, как мне будет сложить все два значения вместе.

МожетКто-нибудь видит способ хранения этих значений эффективным способом памяти, который позволил бы мне иметь возможность выполнять вычисления на них?

РЕДАКТИРОВАТЬ: "сложить вместе" (объединить? арифметическое сложение?) - арифметическое сложение

Моя проблема в том, что в самом сложном случае у меня есть два 100 000-битных числа (хранящихся в массиве из 12 500 байт).Хранение и ручное переключение битов не проблема, но мне нужна сумма обоих чисел, а затем, чтобы узнать, что это за x бит.

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

«Строки двоичных цифр» определенно звучат для меня как байтовые массивы. Чтобы «добавить» два таких байтовых массива вместе, вам нужно просто выделить новый байтовый массив, который достаточно большой, чтобы вместить все, и скопировать содержимое, используя System.arraycopy.

Однако , который предполагает, что каждая «строка» кратна 8 битам. Если вы хотите «добавить» строку из 15 битов в другую строку из 15 битов, вам необходимо выполнить сдвиг битов. Это может быть проблемой для вас? В зависимости от того, какие операции вам нужны, вы можете даже сохранить объект, который знает о двухбайтовых массивах и может найти произвольный бит в логически объединенной «строке».

В любом случае, byte[] будет путь вперед - или, возможно, BitSet.

0 голосов
/ 04 февраля 2012

Как насчет

// Addition

byte[] resArr = new byte[byteArr1.length];

for (int i=0; i<byteArr1.length; i++)
{
    res = byteArr1[i]+byteArr2[i];
}

?

Вы пытаетесь что-то подобное сделать?

...