Как реализовать неподписанный 64-разрядный интервал в использовании Java класс BigInteger?

Решением моей проблемы было объединение gmock и gtest, как описано по ссылке

https://github.com/google/googletest/blob/master/googlemock/docs/CookBook. md # делегирование-звонки-подделка

Единственное изменение, которое я сделал в своем коде, состоит в том, что вместо определения пути к данным конфигурации с помощью #define я создал функцию getConfigFilePath () который возвращает жестко заданный путь к файлу конфигурации в установленном приложении. Отсюда я издевался над классом, и в моем макете я вызываю фальшивую функцию getConfigFilePath (), которая при выполнении реального кода возвращает жесткий код пути к файлу конфигурации в дереве проекта в ClearCase. Это именно то, что я искал.

13
задан Community 23 May 2017 в 10:29
поделиться

6 ответов

Вы можете хранить значения от 0 до 2 ^ 64-1 в длинном значении.

Многие операции работают должным образом однако большинство API и некоторые операции работают только так, как они предполагают подписанные операции, однако есть обходные пути.

Однако использование BigInteger может быть проще, чтобы разобраться. ;)

1
ответ дан 2 December 2019 в 00:03
поделиться

Вы можете часто использовать числовые типы данных со знаком Java, как если бы они были без знака.

См. Это старое ответ о подписанном и неподписанном в Java.

6
ответ дан 2 December 2019 в 00:03
поделиться

Почему бы не написать свою собственную обертку и под ней использовать подписанный long. Если пользователь хочет получить значение без знака как BigInteger - протестируйте знак и добавьте 2 ^ 64 в BigInteger.

3
ответ дан 2 December 2019 в 00:03
поделиться

Вы можете создать BigInteger из лонга с помощью BigInteger.valueOf (l), где l - лонг.

Но если вы хотите работать с точными 64-битными битами, я бы использовал просто long.

2
ответ дан 2 December 2019 в 00:03
поделиться

you may be want to create a UInt64 class, that encapsulate a BigInteger; you can also check that every operation (add, mul, etc) returns an unsigned 64 bit BigInteger; simulating the overflow maybe tricky

class UInt64 {

    private final BigInteger value;

    private UInt64(BigInteger aValue) {
         // method to enforce your class invariant: 0...2**64-1
         checkInvariantOf(aValue);
         value = aValue; 
    }

    public static UInt64 of(String value) {
         return new UInt64(new BigInteger(value));
    }

    public UInt64 add(UInt64 v) {
         return new UInt64(value.add(v.value));
    }

    ....
}
2
ответ дан 2 December 2019 в 00:03
поделиться

BigInteger неизменны, как вы уже нашли. Возможно, вы захотите взглянуть на подклассы BigInteger и написать свой собственный конструктор, который проверяет ввод и выдает положительный BigInteger в соответствующем диапазоне.

Чтобы поддерживать требование, что числа используют только 64 бита, вам может потребоваться перегрузить различные тоже операции, поэтому они ограничивают результат и возвращают экземпляр вашего нового класса, а не нового BigInteger.

Это, вероятно, довольно трудоемкая работа, но все же лучше, чем делать все с нуля.

1
ответ дан 2 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: