2016-05-11 2 views
0

Я просто хочу преобразовать целое число в двоичную строку с помощью BitSet.BitSet toString() и valueOf() трудно понять

Мой код ниже.

public class BitSetTest { 
    public static void main(String[] args) { 

     //Method_1 
     int value = 10; //0b1010 
     String bits = Integer.toBinaryString(value); 
     BitSet bs = new BitSet(bits.length()); 

     for (int i = 0; i < bits.length(); i++) { 
      if (bits.charAt(i) == '1') { 
       bs.set(i); 
      } else { 
       bs.clear(i); 
      } 
     } 

     System.out.println(bs); //{0, 2} so 0th index and 2nd index are set. 
     System.out.println(Arrays.toString(bs.toLongArray())); //prints [5] 
     System.out.println(Arrays.toString(bs.toByteArray())); 

     //Method_2   
     value = 42; 
     System.out.println(Integer.toBinaryString(value)); //101010 
     BitSet bitSet = BitSet.valueOf(new long[] { value }); 
     System.out.println(bitSet); 
     System.out.println(Arrays.toString(bitSet.toLongArray())); // prints [42] 
     System.out.println(Arrays.toString(bitSet.toByteArray())); 
    } 
} 

Q1) Что я не понимал; который является правильным подходом (Method_1 или Method_2). Method_1 кажется правильным, но bs.toLongArray() дает разные результаты.

Q2) Не могли бы вы объяснить это api public static BitSet valueOf(long[] longs) принимает массив длинных значений вместо одного длинного ..? И что действительно делает с этим массивом.

Java-документ говорит ниже; но я действительно не понял смысла.

Более точно, BitSet.valueOf (длинные позиции) .get (п) == ((длинные позиции [п/64] & (1L < < (п% 64)))! = 0)
для все n < 64 * longs.l длина.

Просьба помочь.

ответ

4

Биты пронумерованы справа.

42 = 0b101010 
<-- bit numbers 

Следовательно, выход {1, 3, 5}.

Ваш метод # 1 разряжает цифры слева.

Вам также не нужно звонить bs.clear(i), так как новый BitSet не имеет битов.

Все разряды первоначально false.


А как BitSet.valueOf() работы, это довольно просто.

Есть две версии для byte данных (byte[], ByteBuffer), а также две версии для long данных (long[], LongBuffer).

A byte состоит из 8 бит, а long состоит из 64 бит. Затем будет создан BitSet с первым N (8 или 64) битами от первого значения, следующими N битами от второго значения и так далее.

E.g. если вы вызываете BitSet.valueOf(new long[] { 1, 2, 3 }), биты 0-63 исходят от первого номера, бит 64-127 поступает из второго номера, а бит 128-191 поступает из третьего номера, в результате получается {0, 65, 128, 129}.

Если вы вызываете BitSet.valueOf(new byte[] { 1, 2, 3 }), биты 0-7 поступают из первого числа, биты 8-15 поступают из второго номера, а биты 16-23 поступают из третьего числа, в результате чего {0, 9, 16, 17}.

+0

Спасибо !!!, Не могли бы вы ответить на мой второй вопрос? –

+0

Ничего себе !! Отличная информация !!! Спасибо!!! –

Смежные вопросы