5

特にJavaでビットベクトルを実装する方法を説明する良いテキスト、本、PDF、またはWebサイトはありますか?

Javaで独自のBitSet実装を作成したいので、この質問をします。その理由は、java.utilからBitSetJavaクラスを変更した場合には実行できない追加機能と微調整を追加したいためです。さらに、ライセンスを処理せずにオープンソースプロジェクトで使用できるように、独自の実装を作成したいと思います。

ありがとう!

4

2 に答える 2

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;
    }
}

上記の例に、独自のセット単位の操作機能を実装して追加することができます。

于 2013-11-12T05:17:45.830 に答える
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;
        }
    }
于 2013-11-12T05:20:09.900 に答える