簡體   English   中英

在Java中添加2個BitSet

[英]Adding 2 BitSets in Java

uhmm以及我需要在Java中增加兩個bitset ..我已經嘗試了使用XOR的基本操作加(對於和)和AND(適合隨身攜帶).. 考慮進位以及 ..

但是答案不是完全正確的...這就是我嘗試過的..

public static BitStorage Add(int n, BitStorage ...manyBitSets)
{
    BitStorage sum = new BitStorage(0, n);      //discarding carry out of MSB
    System.out.print("Addition of: ");
    for(BitStorage bitStorage:manyBitSets)
    {
        //System.out.print(sum+"\t");
        //System.out.print(bitStorage+"\t");
        System.out.println("~~~~~");
        for(int i=n-1;i>=0;i--)
        {
            if(i==n-1)
            {
                System.out.println(sum + " + " +bitStorage);
                sum.set(i, sum.get(i)^bitStorage.get(i));
                //System.out.println(sum.get(i)+" XOR "+bitStorage.get(i));
            }
            else
            {
                System.out.println(sum + " + " +bitStorage+"\t"+(sum.get(i)?"1":"0"+"^"+(bitStorage.get(i)?"1":"0")+"^"+(sum.get(i+1)?"1":"0"+"&"+(bitStorage.get(i+1)?"1":"0"))));
                sum.set(i, sum.get(i)^bitStorage.get(i)^(sum.get(i+1)&bitStorage.get(i+1)));      //carry taken here
                //System.out.println(sum.get(i)+" XOR "+bitStorage.get(i)+" XOR ("+bitStorage.get(i+1)+" AND "+sum.get(i+1));
            }
        }
    }   
    return sum;
}

PS:BitStorage類不過是BitSet的自己實現,帶有一些其他方法..如Add,Subtract,Shift等

它有2個成員:

  1. 整數(n)作為最大大小(我不希望向量的增長或縮小影響按位操作=>因此所有操作都在n處完成)->例如:n為4,則位在BitSet中占據o到3的位置
  2. 大小為n的BitSet對象傳遞給構造函數

另外2分:

  • 我想將其轉換為長數組或字節數組,然后添加,但我只需要JDK 6中的解決方案,而不是7
  • 我不需要從MSB生成的進位,我希望答案使用相同的no(bits)即n

很抱歉多次使用“我想要...”。 。嘗試了很多東西! 和嗯,我需要這個算法的一部分..期待答復.. :) :)

我很累,如果丑陋,請原諒我。 您的攜帶方法已完全損壞,並且即使不應設置任何內容也設置了錯誤的位。 您應該計數以繼續進行,因此,沒有理由在特殊情況下不進行最后處理,因此隨身攜帶將消失。 通過實際執行最后一個結果到下一個循環迭代中,邏輯變得更加簡單。

public static BitStorage Add(int n, BitStorage ...manyBitSets)
{
    BitStorage sum = new BitStorage(0, n);      //discarding carry out of MSB
    System.out.print("Addition of: ");
    for(BitStorage bitStorage:manyBitSets)
    {
        boolean carry = false;
        boolean lastcarry = false;
        //System.out.print(sum+"\t");
        //System.out.print(bitStorage+"\t");
        System.out.println("~~~~~");
        for(int i=0;i<n;i++)
        {
                System.out.println(sum + " + " +bitStorage+"\t"+(sum.get(i)?"1":"0"+"^"+(bitStorage.get(i)?"1":"0")+"^"+(sum.get(i+1)?"1":"0"+"&"+(bitStorage.get(i+1)?"1":"0"))));
                lastcarry = carry;
                carry = sum.get(i) && bitStorage.get(i);
                sum.set(i, lastcarry^sum.get(i)^bitStorage.get(i));      //carry taken here
                //System.out.println(sum.get(i)+" XOR "+bitStorage.get(i)+" XOR ("+bitStorage.get(i+1)+" AND "+sum.get(i+1));
        }
    }   
    return sum;
}

我使用布爾值作為變量,因為如果您使用int或更改它們的方式,則將類構建為BitSet的精簡包裝。

好吧,這是一個有趣的問題,讓我猜了一段時間。

我無法首先導出邏輯,但隨后又切換回基礎知識,並導出了boolean expression用於計算3位運算的總和與進位,這是解決方案:

public static BitSet addBitSet(int n, List<BitSet> bitSetList){
    BitSet sumBitSet = new BitSet(n);
    for (BitSet firstBitSet : bitSetList) {
        BitSet secondBitSet = (BitSet) sumBitSet.clone();
        System.out.println("A:  " + printBitSet(firstBitSet, 6));
        System.out.println("B:  " + printBitSet(secondBitSet, 6));
        boolean carryForNext = false, sum,a,b,c;
        for (int i = n - 1; i >= 0; i--) {
            a=firstBitSet.get(i);
            b=secondBitSet.get(i);
            c=carryForNext;
            sum = a&!b&!c|!a&!b&c|!a&b&!c|a&b&c;
            carryForNext = a&b&!c|a&!b&c|!a&b&c|a&b&c;
            sumBitSet.set(i,sum);
        }
        System.out.println("SUM:" + printBitSet(sumBitSet, 6));
    }
    System.out.println(printBitSet(sumBitSet, 6));
    return sumBitSet;
}

這是printBitSet的代碼:

public static String printBitSet(BitSet bitSet, int size) {
    StringBuilder builder = new StringBuilder("");
    for (int i = 0; i < size; i++) {
        if (bitSet.get(i))
            builder.append("1");
        else
            builder.append("0");
    }
    return builder.toString();
}

我發現了這個錯誤..這是進位的問題..而不是使用相同的邏輯..我解決了另一個邏輯..只是對這兩個數字進行了異或運算(求和),然后再次將其視為一個加數它到具有進位的數字(從與原始數相加得到的數字)。在每次迭代中,AND輸出(進位)向左移動..因為LSB邊的位加法沒有任何進位被加

當進位位全為0時我們停止循環(false)

一個例子:

  1. 0001
  2. +0011
  3. = 0010->(XOR =總和)
  4. +0010->(“ AND輸出=進位..向左移動后顯示,現在將其添加到XOR輸出中)
  5. = 0000->(XOR =總和)
  6. +0100->(AND輸出=進位..在向左移動后顯示,現在將其添加到XOR輸出中)
  7. = 0100->(XOR = sum .. FINAL ANSWER
  8. 0000->(AND輸出=進位..向左移動后顯示..我們在這里停止..因為所有都是0而停止))

一個樣品 :)

import java.util.*;
public class BitSetAddition
{
static String nums[] = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
public static void main(String args[])
{
    for(int q=0;q<nums.length;q++)
    {
        System.out.print(q+1+" -> ");
        BitSet b1 = new BitSet();
        String s = nums[q];
        b1.set(0, s.charAt(0)=='1'?true:false);
        b1.set(1, s.charAt(1)=='1'?true:false);
        b1.set(2, s.charAt(2)=='1'?true:false);
        b1.set(3, s.charAt(3)=='1'?true:false);

        for(int i=0;i<4;i++)
            System.out.print(b1.get(i)?"1":"0");
            System.out.print(" + ");

        BitSet b2 = new BitSet();
        String a = "0001";
        b2.set(0, a.charAt(0)=='1'?true:false);
        b2.set(1, a.charAt(1)=='1'?true:false);
        b2.set(2, a.charAt(2)=='1'?true:false);
        b2.set(3, a.charAt(3)=='1'?true:false);

        for(int i=0;i<4;i++)
            System.out.print(b2.get(i)?"1":"0");
            System.out.print(" = ");

        BitSet sum = new BitSet();
        BitSet carry = new BitSet();
        BitSet toAdd = new BitSet();
        BitSet tempSum = new BitSet();
        BitSet tempCarry = new BitSet();

        sum = b1;
        toAdd = b2;
        do
        {
            copy(4, tempSum, sum);
            copy(4, tempCarry, toAdd);
            tempSum.xor(toAdd);
            tempCarry.and(sum);
            copy(4, sum, tempSum);
            copy(4, carry, leftShift(4, tempCarry));
            copy(4, toAdd, carry);
            //sum.set(i, b1.get(i)^b2.get(i)^(b1.get(i+1)&b2.get(i+1)));
        }while(!carry.equals(new BitSet()));
            //if(i+2<=3)
                //sum.set(i, b1.get(i)^b2.get(i)^(b1.get(i+1)&b2.get(i+1)&(b1.get(i+2)&(b2.get(i+2)))));
            //else if(i+1<=3)
                //sum.set(i, b1.get(i)^b2.get(i)^(b1.get(i+1)&b2.get(i+1)));
            //else
                //sum.set(i, b1.get(i)^b2.get(i));
        for(int i=0;i<4;i++)
            System.out.print(sum.get(i)?"1":"0");

        System.out.println();
    }
}
static void copy(int n,BitSet b, BitSet toCopy)
{
    for(int i=0;i<n;i++)
        b.set(i, toCopy.get(i));
}
static BitSet leftShift(int n, BitSet b)
{
    for(int i=0;i<n;i++)
        b.set(i, b.get(i+1));
        b.set(n-1, false);
        return b;
}
}

程序中的注釋是我以前的邏輯..我發現我以前的邏輯更復雜:P ..如果您願意,請忽略程序的注釋:)

注意:我不希望從MSB位加法中得到進位..根據算法(為此我需要這個)..所以答案(總和)具有相同的位數..任何人都可以調整,如果他們想要:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM