Преобразуйте байт в булев массив длины 4 в Java

Я должен преобразовать байт в массив 4 булевских переменных в Java. Как я мог бы пойти об этом?

8
задан Kevin Panko 17 June 2010 в 02:05
поделиться

2 ответа

Согласно комментарию Майкла Петротта к вашему вопросу, вам необходимо решить, какие биты в 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 ( & ), вы получите это значение обратно, если бит установлен, или ноль, если нет. Если вы хотите проверить разные биты, кроме крайних правых четырех, вам придется создать разные битовые маски.

11
ответ дан 5 December 2019 в 12:07
поделиться

О спецификации

Другие поднимают очень правильный вопрос: в 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]"
    }
}

См. также

  • Effective Java 2nd Edition, Item 32: Use EnumSet instead of bit fields
3
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: