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

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

根据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; } 

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

关于规格

其他人提出了一个非常有效的观点:在Java中, Byte.SIZE == 8 。 也就是说,一个byte有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}" } } 

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

该示例还说明了如何在BitSet上执行or / set联合操作。


EnumSet

可能另一个适用的数据结构是EnumSet ,它是针对enum高度优化的Set实现。 这是一个例子:

 import java.util.*; public class EnumSetExample { enum Style { BOLD, ITALIC, UNDERLINE, BLINKING; } public static void main(String[] args) { EnumSet 

也可以看看

  • 有效的Java第2版,第32项:使用EnumSet而不是位字段