Пример Java BitSet - программирование
Подтвердить что ты не робот

Пример Java BitSet

Я ищу хороший пример Java BitSet для работы с 0 и 1. Я попытался взглянуть на Javadocs, но я не понимаю, как это использовать класс, просто прочитав это. Например, как методы and, or и xor работают на двух разных объектах BitSet?

Например:

  BitSet bits1 = new BitSet();
  BitSet bits2 = new BitSet();

  bits2.set(1000001);
  bits1.set(1111111);

  bits2.and(bits1);

  System.out.println(bits2);

Если я это сделаю, он возвращает bits2 как пустую, почему?

4b9b3361

Ответ 1

Для конкретной проблемы, о которой вы говорили: когда вы вызывали bits2.set(1000001), вы устанавливаете миллионный и первый бит в true. Затем, когда вы пересекались с bits1, в котором был установлен один миллион, 111 тысяч и 111-разрядный бит, у них не было никаких бит.

Я думаю, что вы хотели сделать, это

 bits2.set(0); // set the 0th bit
 bits2.set(6); // set the 6th bit

Помогает ли это прояснить ситуацию?

Ответ 2

Если вы хотите работать с битами, вы можете использовать значения int в Java 7.

int bits2 = 0b1000001;
int bits1 = 0b1111111;
bits2 &= bits1;
System.out.println(Integer.toBinaryString(bits2));

печатает

1000001

Ответ 3

У BitSet нет удобных методов для приема строк таких битов. Я привел несколько ниже, и теперь пример работает так, как вы ожидали. Обратите внимание, что это использует новые функции в Java 7; легко найти реализации этих методов в Интернете, если вы хотите использовать Java 6.

import java.util.BitSet;

class Scratch {
    public static void main(String[] args) {
        BitSet bits1 = fromString("1000001");
        BitSet bits2 = fromString("1111111");

        System.out.println(toString(bits1)); // prints 1000001
        System.out.println(toString(bits2)); // prints 1111111

        bits2.and(bits1);

        System.out.println(toString(bits2)); // prints 1000001
    }

    private static BitSet fromString(final String s) {
        return BitSet.valueOf(new long[] { Long.parseLong(s, 2) });
    }

    private static String toString(BitSet bs) {
        return Long.toString(bs.toLongArray()[0], 2);
    }
}

Ответ 4

Вот некоторые ссылки о bitSet, которые помогут вам:

UPDATE:

В документах говорится:

public void set (int bitIndex)

Sets the bit at the specified index to true.

Поэтому, когда вы вызываете bits2.set(10);, он считается 10 десятичным не 1 0, поэтому вы получаете следующее число 1000000000.

Чтобы установить его правильно, в этом примере я хочу установить второй бит в 1, поэтому я вызываю bits2.set(1);, потому что индекс начинается с 0.

В заключение, для каждого бит, установленного в 1, вам нужно вызвать bitSet.Set и предоставить ему индекс бита.

Ответ 5

Я использую мою реализацию для создания объекта BitSet с использованием строки бит в качестве входных данных.

private static BitSet createFromString(String s) {
    BitSet t = new BitSet(s.length());
    int lastBitIndex = s.length() - 1;

    for (int i = lastBitIndex; i >= 0; i--) {
        if ( s.charAt(i) == '1'){
            t.set(lastBitIndex - i);                            
        }               
    }

    return t;
}

Для ввода строки "1001"

BitSet s1 = createFromString("1001");
    System.out.println(s1);

вывод:

{0, 3}

Ответ 6

Попробуйте следующее:

import java.util.BitSet;

public class BitSetExample {

    public static void main(String args[]){
        BitSet bits1 = new BitSet(7);
        BitSet bits2 = new BitSet(7);

        // set some bits
        for(int i = 0; i < 7; i++) {
            if((i % 2) == 0) bits1.set(i);
            if((i % 3) != 0) bits2.set(i);
        }

        System.out.println("BitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println("\nBitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

        //And
        bits1.and(bits2);

        System.out.println("b1 = b1 AND b2\nBitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println();
        System.out.println("BitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

        //Or
        bits1.or(bits2);

        System.out.println("b1 = b1 OR b2\nBitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println();
        System.out.println("BitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

        //Xor
        bits1.xor(bits2);

        System.out.println("b1 = b1 XOR b2\nBitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println();
        System.out.println("BitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

        //Setting bits to zero and one
        bits1.set(1);
        bits2.set(1,false);

        System.out.println("set bit 1 of BitSet1 to one and set bit 1 of BitSet2 to zero\nBitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println();
        System.out.println("BitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

    }
}

Надеюсь, это полезно. Для получения дополнительной информации посетите: https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structures/BitSetExample.java.