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.如果要检查除最右边四个之外的其他位,则必须创建不同的位掩码.
其他人提出了一个非常有效的观点:在 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)
EnumSet位字段代替| 归档时间: |
|
| 查看次数: |
9550 次 |
| 最近记录: |