我明白这个问题很奇怪,不是我惯用的风格。我目前正在使用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只是idlength的随机整数,为128位。
因此,我的问题是add()
上面用于???
[编辑]
为了使这个问题更加清晰,我们将其置于一个视角:
cp.fingerTable[j] = findId(pot, 0, Network.size() - 1);
调用尝试查找Pot的Id但是它总是错误地返回,因为在此方法中创建的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;
}
}
答案 0 :(得分:5)
如果base
是int而不是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 :(得分:1)
计算2 ** j然后将其添加到cp.chordId。 if是特殊情况,其中s ** 0 = 1,这是不需要的。
答案 2 :(得分:1)
上面的add()用于什么代码?
cp.chordId
的类型为BigInteger
,add()
用于将对象cp.chordId
添加到传递的对象base
并返回新的{{1}它具有添加BigInteger
的{{1}}:BigInteger
和cp.chordId
的价值。
答案 3 :(得分:1)
cp.chordId.add(base);
看起来它似乎试图给cp.chordId
一个基值,具体取决于j
的值。
因此,如果j
为0,则chordid
的基值将为BigInteger.ONE
,否则chorid
的基数将为"2 ^ j"
(即2 < SUP>Ĵ)。