簡體   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