2009-07-08 9 views
10

первый выключен, я должен спросить:
Кто-нибудь знает о текущей реализации 128b UINT для Java?Java: реализация Unsigned 128bit Integer

Мне нужно что-то, чтобы держать природные кардинальные ценности. т.е.: Огромный счетчик.
Я знаю о BigIntegers, которые являются медленными и неизменными. A 128b UINT имеет смысл ...

Я думал о внедрении OWORD, используя пару примитивных длин.

Overflows выбрасывает исключение, а не Wraparound.

В каком примере исходный код/​​блоги следует искать для реализации работы этого класса?

+0

Реализовано нечто похожее год назад, и все, что я могу сказать: я надеюсь, вам не нужно будет выполнять точное модульное/деление ...;) – Tim

+2

Вы можете захватить MutableBigInteger из OpenJDK http://www.docjar.org /html/api/java/math/MutableBigInteger.java.html – akarnokd

ответ

0

Почему бы не использовать BigInteger?

+10

BigInteger - это _slow_, когда вам нужно всего лишь чуть более 64 бит. Раньше эта проблема год назад и оказалась в 25 раз медленнее оригинальной , См. Этот андер для деталей: http://stackoverflow.com/questions/962747/most-shameful-awesome-language-hack/1084538#1084538 – Tim

+9

Странно, что это принятый ответ, учитывая, что OP сказал, что он не хочет BigInteger , –

+4

Тим, ваш комментарий содержит неработающую ссылку. – Gili

4

Я бы использовал 32-битные целые числа в качестве представления, потому что вам нужен более крупный тип (длинный), чтобы получить дополнительную точность для бита переноса, обнаружения переполнения и умножения. Подумайте о 32-битном целочисленном значении в цифре и примените алгоритмы из начальной школы.

+1

Вы можете использовать 64-битные длинны просто отлично ==> вдвое быстрее. Выполнение может быть определено путем изменения знакового бита. –

+0

@ Ира Бакстер Я сомневаюсь, что это будет быстрее. Это было бы возможно, но сложнее для добавления, но не для умножения. Java BigInteger использует int [], и я полагаю, они знают, что они делают. – starblue

+0

Если вам нужен пакет BigInt с очень высокой эффективностью, вы используете самый большой словари, доступный для вашего компьютера, для которого есть встроенная поддержка машинных инструкций. Его трудно найти ПК в эти дни, который не 64 бит. Я поддерживаю свое положение: используйте длинный. Алгоритмы в пакете BigInt, вероятно, типичны для большинства пакетов multiprecision; долго должно падать относительно легко на место. Дополнения больших фигур теперь просто занимают половину такта циклов. Умножения должны быть в 4 раза быстрее, потому что вам нужен только один продукт, а не 4 полуширинные кросс-продукты. –

3

Не говорите мне, что вы планируете иметь 128 статических сеттеров и геттеров, по одному на каждый бит ??? Я бы окончательно выбрал setBit (int index, boolean value) и getBit (int index) как методы экземпляра.

Дополнительные вещи, которые вам нужны: метод toString(), чтобы вы могли получить читаемое человеком представление (в какой-то момент вы захотите напечатать цифры, я думаю).

Помните, что все порядковые типы в java подписаны (за исключением символа), поэтому, если вы планируете использовать две длинные точки, всегда помните, что нижняя часть может быть проблематичной для обнаружения переполнений и т. Д. во всяком случае, у вас будет 127-битное число, за исключением того, что нижняя часть будет обрабатываться как 63-битная без знака.

+0

Где OP даже намек на сеттеры для каждого бит? –

+0

http://stackoverflow.com/revisions/1096964/list вы должны взглянуть перед критикой. – fortran

+1

Хорошо, теперь я это вижу. Я не ожидал, что мне придется прочитать изменения вопроса, чтобы понять это; что кажется немного выше. Я отменил ваш ответ. –