Управление максимальным значением беззнакового целого - PullRequest
1 голос
/ 08 апреля 2020

Если у меня есть 4-разрядное целое число без знака, максимальное значение равно 15. Если значение равно 0 и я вычитаю 1, я получаю 15. Я могу увеличить размер бита на 1 и иметь максимальное значение 31, и так далее и так далее. Это здорово, но я хочу иметь возможность контролировать максимальное значение, чтобы оно отличалось от 2 ^ n - 1.

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

Вариант использования для этого, о котором я думаю, заключается в том, чтобы я мог обрабатывать массив элементов как циклически связанный список без использования связанного списка. Извините, если это глупый вопрос!

1 Ответ

1 голос
/ 08 апреля 2020

Вы можете использовать оператор модуля %, который возвращает остаток между двумя операндами. Например, если вы хотите, чтобы максимальное значение равнялось 13, при условии, что вы индексируете с помощью переменной i, вы можете сделать array[i % 14], что приведет к тому, что индекс будет находиться в диапазоне 0 -> 13. не уверен, есть ли способ создать пользовательский тип с этим свойством, если только вы не создали класс и не реализовали методы для операторов сложения и вычитания, чтобы создать то же поведение, что и для целого числа без знака. Вот суть этого:

public class MaxInt {
    private final int max;
    private int value;

    public MaxInt(int max, int value) {
        this.max = max;
        this.value = value;
    }

    public MaxInt plus(int a) {
        return new MaxInt(this.max, (this.value + a) % (this.max + 1));
    }

    public MaxInt minus(int a) {
        return new MaxInt(this.max, (this.value - a) % (this.max + 1));
    }

    public getValue() {
        return this.value;
    }
}

Тогда вы можете сделать то же самое с new MaxInt(13, 0), и ваше значение будет между 0 -> 13.

...