Я должен преобразовать байт в массив 4 булевских переменных в Java. Как я мог бы пойти об этом?
Согласно комментарию Майкла Петротта к вашему вопросу, вам необходимо решить, какие биты в 8-битном байте следует проверять для результирующего логического массива. В демонстрационных целях предположим, что вам нужны четыре крайних правых бита, тогда должно работать что-то вроде этого:
public static boolean[] booleanArrayFromByte(byte x) {
boolean bs[] = new boolean[4];
bs[0] = ((x & 0x01) != 0);
bs[1] = ((x & 0x02) != 0);
bs[2] = ((x & 0x04) != 0);
bs[3] = ((x & 0x08) != 0);
return bs;
}
Шестнадцатеричные значения ( 0x01
, 0x02
и т. Д.) В этом примере: специальные битовые маски, в которых в желаемом месте установлен только один бит; поэтому 0x01 имеет установленный только крайний правый бит, 0x08 имеет установленный только четвертый справа бит. Проверяя данный байт на соответствие этим значениям с помощью побитового оператора AND ( &
), вы получите это значение обратно, если бит установлен, или ноль, если нет. Если вы хотите проверить разные биты, кроме крайних правых четырех, вам придется создать разные битовые маски.
Другие поднимают очень правильный вопрос: в Java, Byte.SIZE == 8
. То есть, в байте
8 бит. Вам нужно определить, как вы хотите преобразовать 8 бит в 4 значения boolean
, иначе мы можем только догадываться, что именно вы пытаетесь сделать.
BitSet
Независимо от того, как вы сделаете это отображение, однако, маловероятно, что boolean[]
действительно является лучшим представлением. java.util.BitSet
может быть лучше. Вот пример:
import java.util.*;
public class BitSetExample {
static BitSet toBitSet(byte b) {
BitSet bs = new BitSet(Byte.SIZE);
for (int i = 0; i < Byte.SIZE; i++) {
if (((b >> i) & 1) == 1) {
bs.set(i);
}
}
return bs;
}
public static void main(String[] args) {
BitSet bs = toBitSet((byte) 10);
System.out.println(bs); // prints "{1, 3}"
System.out.println(bs.get(3)); // prints "true"
System.out.println(bs.get(2)); // prints "false"
byte b = 25;
System.out.println(toBitSet(b)); // prints "{0, 3, 4}"
bs.or(toBitSet(b));
System.out.println(bs); // prints "{0, 1, 3, 4}"
}
}
Приведенный выше код использует стандартную технику битового зондирования для преобразования байта
в BitSet
. Обратите внимание, что в (байте) 10
установлены биты 1 и 3 (т.е. 10 = 2^1 + 2^3
, где ^
обозначает экспоненцию).
Пример также показывает, как выполнить операцию объединения or
/set на BitSet
.
EnumSet
Возможно, другой применимой структурой данных является EnumSet
, которая представляет собой Set
реализацию, сильно оптимизированную для enum
. Вот пример:
import java.util.*;
public class EnumSetExample {
enum Style {
BOLD, ITALIC, UNDERLINE, BLINKING;
}
public static void main(String[] args) {
EnumSet<Style> myStyle = EnumSet.of(Style.BOLD, Style.UNDERLINE);
System.out.println(myStyle);
// prints "[BOLD, UNDERLINE]"
System.out.println(myStyle.contains(Style.UNDERLINE));
// prints "true"
System.out.println(myStyle.contains(Style.BLINKING));
// prints "false" (thank goodness!)
myStyle.add(Style.ITALIC);
System.out.println(myStyle);
// prints "[BOLD, ITALIC, UNDERLINE]"
}
}
EnumSet
instead of bit fields