【发布时间】:2012-07-27 05:45:51
【问题描述】:
嗯,我需要在 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 个成员:
- 一个整数 (n) 作为最大大小(我不希望向量的增长或收缩影响按位操作 => 因此所有操作都在 n 完成)-> 例如:n 为 4,然后位占据位置 o 到 3 in位集
- 一个大小为 n 的 BitSet 对象传入构造函数
还有2分:
- 我想将其转换为长数组或字节数组,然后添加,但我只需要在 JDK 6 而不是 7 中的解决方案
- 我不需要从 MSB 生成的进位,我希望答案是相同的 no(bits),即 n
很抱歉多次使用“我想要...”.. 有点累。 .尝试了很多东西! 嗯,我需要这个作为算法的一部分.. 期待回复.. :) :)
【问题讨论】:
-
虽然我很高兴能像这样展示你的所有代码......请解释为什么这“不太正确”......你得到的答案是不正确的?
-
我花了一段时间才明白发生了什么,但我终于弄明白了。如果下次包含一个简短的示例调用会有所帮助。你的进位坏了,所以你总是设置错误的位。
-
@BillJames 谢谢! . .and 嗯嗯,包括进位在内的许多附加功能都有问题..
-
@SilverbackNet 嗯是的.. 我想通了.. 过了一段时间我发布了这个问题..
标签: java bit-manipulation bitwise-operators bits