在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
而不是位字段