[英]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個成員:
另外2分:
很抱歉多次使用“我想要...”。 。嘗試了很多東西! 和嗯,我需要這個算法的一部分..期待答復.. :) :)
我很累,如果丑陋,請原諒我。 您的攜帶方法已完全損壞,並且即使不應設置任何內容也設置了錯誤的位。 您應該計數以繼續進行,因此,沒有理由在特殊情況下不進行最后處理,因此隨身攜帶將消失。 通過實際執行最后一個結果到下一個循環迭代中,邏輯變得更加簡單。
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)
一個例子:
一個樣品 :)
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.