2010-04-26 2 views
1

В моей программе я использую BitArrays для представления 160-битных чисел. Я хочу иметь возможность добавлять, вычитать, увеличивать и уменьшать эти числа, каков алгоритм для этого?Добавление в бит-массив

На данный момент меня не интересуют размножение и деление, но я мог бы быть в будущем, поэтому бонусные баллы за это.

Я реализации в C#, но псевдокод хорошо, если вы не знакомы с языком

+0

BitArrays - не лучший инструмент для расчетов. –

+0

То же, что и в средней школе, с двоичным, а не десятичным (или если вы хотите лучше воспользоваться оборудованием, в базе 2 ** 16, 2 ** 32 или что вам удобно). –

+0

Я знаю, что бит-массивы не идеальны, но огромное количество моего кода выполняет индивидуальное свертывание бит, и я очень редко делаю какие-либо арифметические операции. Следовательно, бит-массивы – Martin

ответ

1

Поскольку вы используете C#, вы можете захотеть взглянуть на BigInteger, который был добавлен в недавно выпустила .NET 4.0.

+0

Омг, это так полезно O_O Thankyou! – Martin

0

увеличивающие и уменьшающие вы можете написать вручную, и добавление, substracing вы можете сделать это с помощью метода записи. Вы знаете этот метод, потому что вы используете в базовой школе этот метод работает на всех цифровых системах, не только для основания 2 и 10.

Как это:

100100 
010110 + 
-------- 
111010 
0

Массивы беззнаковых 8-битных байтов может сделать это намного Полегче. Тогда вам просто нужно добавить/вычесть из младшего значащего байта и переносить дескриптор.

Существует много информации на binary addition.

В качестве альтернативы, вы можете сэкономить некоторую боль и re-use чужого imlpementation :-)

+0

Как выглядит массив байтов? Это быстрее, но алгоритмы в основном одинаковы, независимо от того, используете ли вы биты, байты, слова, что угодно. –

+0

Действительно, перенос является основной проблемой при добавлении, и это то же самое с битами или байтами. – Martin

+0

. Я не так хорошо знаком с реализацией C# в BitArray, но догадался из вашего сообщения, что он не включает арифметические операторы? ..unsigned char's _do_ имеют собственные арифметические операторы, которые вы можете использовать. –

1

Существует лучший способ, математика средней школы использует стандартный подход «пульсация», который имеет тот недостаток, что вам приходится работать по одному бит за раз. «Carry смотреть вперед» это термин, который вы хотите Google или просто читать:

http://en.wikipedia.org/wiki/Carry_look-ahead_adder

Она группирует биты и делает некоторые умные логики, чтобы значительно сократить количество шагов, чтобы добавить номера вместе. Существует параллельный процесс вычитания. Я просто не могу запомнить имя.

+0

Carry look-ahead не сохраняет никаких шагов, на самом деле он использует больше шагов. Полезно только увеличивать параллелизм сложения, что не очень полезно в программном обеспечении для размеров номеров, о которых говорит плакат (он очень популярен в аппаратных сумматорах). Добавление переноса может потенциально быть полезным, если на плакате есть много номеров, которые нужно добавить (или будет делать умножение), но это звучит не так. –

Смежные вопросы