Как реализовать битовый вектор (bitset) (в Java)? - PullRequest
5 голосов
/ 22 октября 2011

Есть ли хороший текст, книги, PDF или веб-сайт, который объясняет, как реализовать битовый вектор, особенно в Java?

Я задаю этот вопрос, потому что я хотел бы сделать свою собственную реализацию BitSet в Java.Причина в том, что я хочу добавить дополнительные функции и настроить, что невозможно сделать, если я изменю класс Java BitSet из java.util.Более того, я хочу сделать свою собственную реализацию, чтобы я мог использовать ее в своем проекте с открытым исходным кодом без необходимости иметь дело с лицензиями.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 12 ноября 2013

Если вы хотите необычную производительность или другие необычные функции для вашего битового вектора или набора битов, то, как кто-то уже предложил, вы должны унаследовать существующую реализацию битового вектора / набора. Или вы можете обратиться к некоторым реализациям с открытым исходным кодом. Однако, если вы хотите узнать механизм битового вектора, это довольно просто. Вот пример реализации:

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

Вы можете реализовать и добавить свои собственные функции управления настройками в приведенный выше пример.

2 голосов
/ 12 ноября 2013

Быстрая реализация по вашему требованию.Надеюсь, это поможет.

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