是否有一些好的文本,书籍,PDF或网站解释了如何实现位向量,尤其是在Java中?
我问这个问题是因为我想在Java中创建自己的BitSet实现。原因是我想添加aditional功能和调整,如果我从java.util修改BitSet Java类,则无法完成。此外,我想制作自己的实现,以便我可以在我的开源项目中使用它而无需处理许可证。
谢谢!
答案 0 :(得分:5)
如果你想要你的位向量或位集的花哨的性能或其他花哨的功能,那么正如一些人已经建议的那样,你应该继承现有的位向量/集的实现。或者,您可以参考一些开源实现。但是,如果你想学习位向量的机制,那就相当简单了。这是一个实现示例:
class BitSet{
private Byte[] p;
private BitSet(){
p = null;
}
public BitSet(int n){
assert n > 0;
p = new Byte[(n - 1) >> 3 + 1];
}
public BitSet Complement(){
BitSet bs = new BitSet();
bs.p = new Byte[p.length];
for(int i = 0; i < p.length; i++){
bs.p[i] = ~ p[i];
}
return bs;
}
public BitSet Union(BitSet bs2){
assert p.length == bs2.p.length;
BitSet bs = new BitSet();
bs.p = new Byte[p.length];
for(int i = 0; i < p.length; i++){
bs.p[i] = p[i] | bs2.p[i];
}
return bs;
}
public BitSet Intersection(BitSet bs2){
assert p.length == bs2.p.length;
BitSet bs = new BitSet();
bs.p = new Byte[p.length];
for(int i = 0; i < p.length; i++){
bs.p[i] = p[i] & bs2.p[i];
}
return bs;
}
}
您可以在上面的示例中实现并添加自己的设置操作功能。
答案 1 :(得分:2)
快速实施您的要求。希望它有所帮助。
public class BitSet
{
int[] numbers;
public BitSet(int k){
numbers = new int[(k >> 5) + 1];
}
public void set(int k)
{
int remender = k & 0x1F;
int devide = k >> 5;
result[devide] = result[devide] | (1<<remender);
}
public void unset(int k)
{
int remender = k & 0x1F;
int devide = k >> 5;
result[devide] = result[devide] & (~(1<<remender));
}
public boolean isSet(int k)
{
int remender = k & 0x1F;
int devide = k >> 5;
return (result[devide] & (1<<remender))!=0;
}
}