Algorithm 如何实现位向量(位集)(在Java中)?

Algorithm 如何实现位向量(位集)(在Java中)?,algorithm,vector,bit,bitset,Algorithm,Vector,Bit,Bitset,是否有一些好的文本、书籍、pdf或网站解释如何实现位向量,特别是在Java中 我问这个问题是因为我想用Java实现我自己的位集。原因是我想添加一些传统的功能和调整,如果我从Java.util修改BitSet Java类,这些功能和调整是无法完成的。此外,我希望自己实现,这样我就可以在我的开源项目中使用它,而无需处理许可证 谢谢 如果您希望位向量或位集具有出色的性能或其他出色的功能,那么正如某些人已经建议的那样,您应该继承位向量/位集的现有实现。或者,您可以参考一些开源实现。然而,如果你想学习位向

是否有一些好的文本、书籍、pdf或网站解释如何实现位向量,特别是在Java中

我问这个问题是因为我想用Java实现我自己的位集。原因是我想添加一些传统的功能和调整,如果我从Java.util修改BitSet Java类,这些功能和调整是无法完成的。此外,我希望自己实现,这样我就可以在我的开源项目中使用它,而无需处理许可证


谢谢

如果您希望位向量或位集具有出色的性能或其他出色的功能,那么正如某些人已经建议的那样,您应该继承位向量/位集的现有实现。或者,您可以参考一些开源实现。然而,如果你想学习位向量的机制,它是相当简单的。以下是一个实现示例:

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;
    }
}
类位集{
专用字节[]p;
专用位集(){
p=零;
}
公共位集(int n){
断言n>0;
p=新字节[(n-1)>>3+1];
}
公共位集补码(){
位集bs=新位集();
bs.p=新字节[p.length];
for(int i=0;i

您可以在上面的示例中实现并添加您自己的set-wise操作功能。

这是一个满足您需求的快速实现。希望能有帮助

    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;
        }
    }
公共类位集
{
int[]数字;
公共位集(int k){
数字=新整数[(k>>5)+1];
}
公共无效集(int k)
{
int remender=k&0x1F;
int-devide=k>>5;
结果[偏差]=结果[偏差]|(15;
结果[devide]=结果[devide]&(~(15;

return(result[devide]&(1Apache Mahout有一个开源的位集。为什么不使用其他位集并继承它们呢?结果在哪里初始化