Преобразование байта или int в битовый набор

Имею следующее:

int num=Integer.parseInt(lineArray[0]);
byte numBit= num & 0xFF;

Есть ли очень простой способ преобразовать numBit в битовый массив? Или даже лучше, есть ли способ обойти байтовое преобразование int и сразу перейти от num к битовому массиву?

Спасибо


person moesef    schedule 05.08.2012    source источник
comment
Думаю, это будет и в вашем случае ... [Stackoverflow - Bitset to and from Integer Long] [1] [1]: stackoverflow.com/questions/2473597/   -  person Pr0gr4mm3r    schedule 06.08.2012
comment
Вы имеете в виду boolean[] или BitSet?   -  person dacwe    schedule 06.08.2012


Ответы (5)


Если вам нужен BitSet, попробуйте:

final byte b = ...;
final BitSet set = BitSet.valueOf(new byte[] { b });

Если вы хотите boolean[],

static boolean[] bits(byte b) {
  int n = 8;
  final boolean[] set = new boolean[n];
  while (--n >= 0) {
    set[n] = (b & 0x80) != 0;
    b <<= 1;
  }
  return set;
}

или, что то же самое,

static boolean[] bits(final byte b) {
  return new boolean[] {
    (b &    1) != 0,
    (b &    2) != 0,
    (b &    4) != 0,
    (b &    8) != 0,
    (b & 0x10) != 0,
    (b & 0x20) != 0,
    (b & 0x40) != 0,
    (b & 0x80) != 0
  };
}
person obataku    schedule 05.08.2012
comment
Я наткнулся на этот ответ и хотел отметить, что методы BitSet.valueOf() есть только в Java 7 и более поздних версиях. В вопросе не указана версия Java, но если вы используете Java 6, вы должны иметь возможность использовать один из подходов для создания boolean [] для заполнения объекта BitSet. - person Thomas Owens; 23.01.2015
comment
Разве это не должно быть set[n] = (b & 0x80) != 0; во втором фрагменте? И вам нужно выполнить пост-инкремент в цикле while: while (n-- > 0). В противном случае вы пропускаете бит 0. - person Jaykob; 03.11.2015

В Java 7 есть BitSet.valueOf (long []) и BitSet.toLongArray ()

int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
person Grigory Kislin    schedule 25.03.2014

Вы могли сделать:

char[] bits = Integer.toBinaryString(num).toCharArray();, чтобы получить нижележащую битовую строку как char[]

E.g.

public BitSet getBitSet(int num){
    char[] bits = Integer.toBinaryString(num).toCharArray();  
    BitSet bitSet = new BitSet(bits.length);  
    for(int i = 0; i < bits.length; i++){  
        if(bits[i] == '1'){
            bitSet.set(i, true);
        }
        else{
            bitSet.set(i, false);
        }                
    }
    return bitSet;
}  

Таким же образом можно создать массив boolean [].

person Cratylus    schedule 05.08.2012
comment
Здесь вы делаете двойную работу - toBinaryString() тоже перебирает биты. Вам было бы лучше с зацикливанием i < Integer.SIZE и прямым битовым тестом 0 < (num & 1 << i). Не говоря уже о том, что биты в свежем BitSet предварительно установлены на false. Проще говоря, ваш код многословен и неэффективен. - person charlie; 04.07.2016

Я пришел к этой теме, потому что Android добавил BitSet.valueOf()as позже, чем в API 19. Я использовал второй фрагмент принятого ответа oldrinb, но мне пришлось изменить его, потому что в нем были некоторые ошибки. Кроме того, я изменил его, чтобы он возвращал BitSet, но изменить его на boolean [] не должно быть проблемой. См. Мой комментарий к его ответу.

Это модификация, которая сейчас успешно работает:

public static BitSet toBitSet(byte b) {
    int n = 8;
    final BitSet set = new BitSet(n);
    while (n-- > 0) {
        boolean isSet = (b & 0x80) != 0;
        set.set(n, isSet);
        b <<= 1;
    }
    return set;
}
person Jaykob    schedule 03.11.2015

Просто упражнение по использованию потоков (J8 +):

// J7+
BitSet bitSet(final long... nums) {
    return BitSet.valueOf(nums);
}

// J8+
final IntStream bitsSet = bitSet(num).stream();

// vice-versa
BitSet bitSet(final IntStream bitsSet) {
    return bitsSet.collect(BitSet::new, BitSet::set, BitSet::or);
}

// without BitSet
IntStream bitsSet(final long... nums) {
    return IntStream.range(0, nums.length)
            .flatMap(n -> IntStream.range(0, Long.SIZE - 1)
                    .filter(i -> 0 != (nums[n] & 1L << i))
                    .map(i -> i + n * Long.SIZE));
}
person charlie    schedule 04.07.2016