Как реализовать битовый вектор (набор битов) (в Java)?

#algorithm #vector #bit #bitset

#алгоритм #вектор #бит #набор битов

Вопрос:

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

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

Спасибо!

Комментарии:

1. Apache Mahout имеет набор битов с открытым исходным кодом.

2. почему не использовать другие наборы битов и просто наследовать их?

Ответ №1:

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

 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] amp; bs2.p[i];
        }
        return bs;
    }
}
  

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

Ответ №2:

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

     public class BitSet
    {
        int[] numbers;
        public BitSet(int k){
            numbers = new int[(k >> 5)   1];
        }
        public void set(int k)
        {
            int remender = k amp; 0x1F;
            int devide = k >> 5;
            result[devide] = result[devide] | (1<<remender);
        }

        public void unset(int k)
        {
            int remender = k amp; 0x1F;
            int devide = k >> 5;
            result[devide] = result[devide] amp; (~(1<<remender));
        }

        public boolean isSet(int k)
        {
            int remender = k amp; 0x1F;
            int devide = k >> 5;
            return (result[devide] amp; (1<<remender))!=0;
        }
    }
  

Комментарии:

1. где инициализируется ваш результат