Java 大整数-这段代码在做什么?

Java 大整数-这段代码在做什么?,java,chord,Java,Chord,我知道这个问题很奇怪,不是我通常的风格。我目前正在做一个项目,使用peersim中的chord实现。下面的代码显示了一个大整数以及对其执行的一些操作。我的chordId是对象的散列,为什么要使用add?这有什么作用 BigInteger base; if (j == 0) base = BigInteger.ONE; else { base = BigInteger.valueOf(2); for (int exp = 1; exp < j; exp++) {

我知道这个问题很奇怪,不是我通常的风格。我目前正在做一个项目,使用peersim中的chord实现。下面的代码显示了一个大整数以及对其执行的一些操作。我的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);
被调用,它尝试查找Pot的Id,但它总是返回错误,因为在此方法中创建的chordId不存在。我不确定该用什么替换罐子,也不确定是否要将它完全取出

[编辑二]

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;
    }
}

如果base是int而不是BigInteger,那么代码就是这样的:

这意味着它相当于:

int base = (int) Math.pow(2, j);
int pot = cp.chordId + base;
它基本上增加了
2j到cp.chordId

如果base是int而不是BigInteger,代码就是这样的:

这意味着它相当于:

int base = (int) Math.pow(2, j);
int pot = cp.chordId + base;
它基本上增加了
2j到cp.chordId

它正在计算2**j,然后将其添加到cp.chordId。
if用于s**0=1的特殊情况,实际上不需要它。

它计算2**j,然后将其添加到cp.chordId。 if适用于s**0=1的特殊情况,实际上并不需要

上面的add代码是用来做什么的

cp.chordId的类型为BigInteger,用于将对象cp.chordId添加到传递的对象基中,并返回一个新的BigInteger,该值同时包含BigInteger的值:cp.chordId和base

上面的add代码是用来做什么的

cp.chordId的类型为BigInteger,用于将对象cp.chordId添加到传递的对象基中,并返回一个新的BigInteger,该值同时包含BigInteger的值:cp.chordId和base

这样看来,它试图根据j的值给cp.chordId一个基值

因此,如果j为0,则弦的基值将为BigInteger。否则,弦的基值将为2^j,即2j

这样看来,它试图根据j的值给cp.chordId一个基值


因此,如果j为0,则chordid的基值将为BigInteger。另外,chorid的基值将为2^j,即2j。

不幸的是,为了应用程序的目的,它必须是BigInteger,但看到如何做不同的事情总是好的。@RossAlexander当然。但是BigInteger确实有一个.powmethod@RossAlexander代码在功能上仍然相同;所以,如果它之前给了你一个错误,这不会改变。你必须找出它为什么不归还它应该归还的东西。从您刚刚发布的代码的外观来看,这对于堆栈溢出问题来说太过分了。试着缩小问题的范围,如果有必要的话问一个新问题。我以前在使用随机大整数时没有遇到过问题。这会有什么不同吗?谢谢你的帮助,顺便说一句,我真的不指望有人会回复@RossAlexander随机大整数是什么意思?不幸的是,对于应用程序来说,它必须是一个大整数,但是看到如何做一些不同的事情总是很好的。@RossAlexander当然。但是BigInteger确实有一个.powmethod@RossAlexander代码在功能上仍然相同;所以,如果它之前给了你一个错误,这不会改变。你必须找出它为什么不归还它应该归还的东西。从您刚刚发布的代码的外观来看,这对于堆栈溢出问题来说太过分了。试着缩小问题的范围,如果有必要的话问一个新问题。我以前在使用随机大整数时没有遇到过问题。这会有什么不同吗?谢谢你的帮助,顺便说一句,我真的不指望有人会回复@RossAlexander你所说的随机大整数是什么意思?findId看起来像什么?findId看起来像什么?
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;
cp.chordId.add(base);