繁体   English   中英

循环遍历java BigInteger中的各个位

[英]Cycling through the individual bits in a java BigInteger

我正在尝试为加密分配实现一些蒙哥马利数学代码; 除了我需要将BigInteger中的每个位与One进行比较之外,我的大部分工作都在工作。

我一直在使用的数学算法,从步骤4开始

for i = k - 1 down to 0 do
xBar = MonPro(xBar, xBar)
if e[i] = 1 then xBar = MonPro(MBar, xBar)

我只是一个索引,k是BIgInteger中的位数,b是指数。 我的尝试是:

for(int i = n.bitLength() - 1; i > 0 ; i--) {
    xBar = monPro(xBar, xBar, r, nPrime, n);
    if (n.testBit(i) == true)
         xBar = monPro(mBar, xBar, r, nPrime, n);
}
return monPro(xBar, BigINteger.ONE, r, nPrime, n); 

monPro是一个绝对有效的辅助函数。 同样,在该代码片段之前省略的步骤肯定有效。 所以主要的问题是,我如何按位迭代BigInteger? 除非我对e [i]有误,请参阅下文。

在过去的这段时间里,我已经完成了大量的阅读,而且实际实施方面的资源很少。 一些关于这个主题的数学论文纯粹是神秘的。

我也不确定是上面的e [i]。 在书中,它有一点点在它下面,就像Log2通常将2写在它下面的一个小数字一样。 任何人都可以澄清吗?

我已经尝试将BigInteger转换为基数为2的字符串,并将char数组从中进行比较并对其进行比较。 我还尝试使用BigInteger.toString(2)创建一个基数为2的字符串,然后使用charAt [i] == 1循环。

我确定e [i]之上的所有步骤都是正确的,因为我已经用很多不同的值检查了它们。

如果我在E [i]方面偏离轨道,那么有人可以解释它的实际含义吗? 如果没有,任何人都可以指出任何错误或轻微的方向?

这是一项家庭作业,所以请不要列出任何代码以外的代码。

非常感谢任何方向或建议。

for(int i = n.bitLength() - 1; i > 0 ; i--) { ... }

这将错过第0位(因为当i==0 ,循环终止。)
尝试使用>=而不是>

for(int i = n.bitLength() - 1; i >= 0 ; i--) { ... }

或者,如果您使用的是Java 7 并且您知道n是正数,则可以将其转换为BitSet并迭代其“1”位:

static void showBitsOf(BigInteger n) {
    if (n.compareTo(BigInteger.ZERO) < 0) {
        throw new IllegalArgumentException("n must not be negative");
    }
    BitSet bs = BitSet.valueOf(n.toByteArray());
    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
        System.out.println(i);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM