Big Integer - Что делает этот код? - PullRequest
1 голос
/ 24 ноября 2011

Я понимаю, что это странные вопросы, а не мой обычный стиль. В настоящее время я делаю проект с использованием реализации аккордов в peersim. В приведенном ниже коде показано большое целое число и выполняются некоторые операции с ним. Мой chordId - это хеш объекта, зачем вам использовать add()? какой цели это служит?

BigInteger base;
if (j == 0)
    base = BigInteger.ONE;
else {
    base = BigInteger.valueOf(2);
    for (int exp = 1; exp < j; exp++) {
        base = base.multiply(BigInteger.valueOf(2));
    }
}
BigInteger pot = cp.chordId.add(base);

До его аккорда Id был просто случайным целым числом бездействия, которое было 128 бит.

Поэтому мой вопрос: какой фрагмент кода выше add() используется для ???

[EDIT]

Чтобы немного прояснить этот вопрос:

cp.fingerTable[j] = findId(pot, 0, Network.size() - 1);
Вызывается

, который пытается найти Id of Pot, однако он всегда возвращает ошибку, поскольку созданный в этом методе chordId не существует. Я не уверен, что заменить горшок или вынуть его полностью.

[EDIT2]

findId выглядит так (это не мой код, поэтому мое замешательство :))

public Node findId(BigInteger id, int nodeOne, int nodeTwo) {
    if (nodeOne >= (nodeTwo - 1))
        return Network.get(nodeOne);
    int middle = (nodeOne + nodeTwo) / 2;
    if (((middle) >= Network.size() - 1))
        System.out.print("ERROR: Middle is bigger than Network.size");
    if (((middle) <= 0))
        return Network.get(0);
    try {
        BigInteger newId = ((ChordProtocol) ((Node) Network.get(middle))
                .getProtocol(pid)).chordId;
        BigInteger lowId;
        if (middle > 0)
            lowId = ((ChordProtocol) ((Node) Network.get(middle - 1))
                    .getProtocol(pid)).chordId;
        else
            lowId = newId;
        BigInteger highId = ((ChordProtocol) ((Node) Network
                .get(middle + 1)).getProtocol(pid)).chordId;
        if (id.compareTo(newId) == 0
                || ((id.compareTo(newId) == 1) && (id.compareTo(highId) == -1))) {
            return Network.get(middle);
        }
        if ((id.compareTo(newId) == -1) && (id.compareTo(lowId) == 1)) {
            if (middle > 0)
                return Network.get(middle - 1);
            else
                return Network.get(0);
        }
        if (id.compareTo(newId) == -1) {
            return findId(id, nodeOne, middle);
        } else if (id.compareTo(newId) == 1) {
            return findId(id, middle, nodeTwo);
        }
        return null;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

Ответы [ 4 ]

5 голосов
/ 24 ноября 2011

Вот как будет выглядеть код, если бы base было целым числом вместо BigInteger:

int base;
if (j == 0)
    base = 1;
else {
    base = 2;
    for (int exp = 1; exp < j; exp++) {
        base = base * 2;
    }
}
int pot = cp.chordId + base;

На самом деле весь этот фрагмент кода можно заменить на:

BigInteger base = BigInteger.valueOf(2).pow(j);
BigInteger pot = cp.chordId.add(base);

Что означает, что это эквивалентно:

int base = (int) Math.pow(2, j);
int pot = cp.chordId + base;

Это в основном добавляет 2 j до cp.chordId

1 голос
/ 24 ноября 2011
cp.chordId.add(base);

При этом похоже, что он пытается дать cp.chordId базовое значение в зависимости от значения j.

Таким образом, если j равно 0, базовое значение для chordid будет BigInteger.ONE, в противном случае основание для chorid будет "2 ^ j" (то есть 2 j ).

1 голос
/ 24 ноября 2011

для чего используется приведенный выше код add ()?

cp.chordId имеет тип BigInteger, а используется add()добавить объект cp.chordId к переданному объекту base и вернуть новый BigInteger со значением добавления BigInteger: cp.chordId и base.

1 голос
/ 24 ноября 2011

Он вычисляет 2 ** j и затем добавляет его в cp.chordId.If - это особый случай, когда s ** 0 = 1, который на самом деле не нужен.

...