在Java中将字节转换为长度为4的布尔数组

Agr*_*ag9 8 java byte bit

我需要在Java中将一个字节转换为4个布尔值的数组.我怎么能这样做?

mae*_*ics 11

根据Michael Petrotta对您的问题的评论,您需要确定应该为结果布尔数组测试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;
}
Run Code Online (Sandbox Code Playgroud)

此示例中的十六进制值(0x01,0x02等)是特殊位掩码,只在所需位置设置了一个位; 所以0x01只有最右边的位设置,0x08只有第四个右位设置.通过使用按位AND运算符(&)测试给定字节对这些值,如果该位置位,则将返回该值,否则返回0.如果要检查除最右边四个之外的其他位,则必须创建不同的位掩码.


pol*_*nts 5

关于规格

其他人提出了一个非常有效的观点:在 Java 中,Byte.SIZE == 8. 也就是说,a中有8位byte。您需要定义如何将 8 位映射为 4 个boolean值;否则我们只能猜测你想做什么。


BitSet

然而,无论您如何进行此映射,它都不太可能boolean[]真正是最佳表示。Ajava.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}"
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码使用标准位探测技术将 a 转换byte为 a BitSet。请注意,a(byte) 10已设置其位 1 和 3(即10 = 2^1 + 2^3,其中^表示求幂)。

该示例还展示了如何or在 上执行 /set union 操作BitSet


EnumSet

可能另一种适用的数据结构是 an 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]"
    }
}
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • 《Effective Java》第二版,第 32 条:使用EnumSet位字段代替