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

在Java中将字节转换为长度为4的布尔数组,java,byte,bit,Java,Byte,Bit,我需要在Java中将一个字节转换成4个布尔值的数组。我该怎么做呢?根据Michael Petrotta对您的问题的评论,您需要决定8位字节中的哪些位应该为生成的布尔数组进行测试。出于演示目的,假设您需要最右边的四个位,那么类似的方法应该可以工作: public static boolean[] booleanArrayFromByte(byte x) { boolean bs[] = new boolean[4]; bs[0] = ((x & 0x01) != 0);

我需要在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;
}
本例中的十六进制值(
0x01
0x02
等)是在所需位置仅设置了一个位的特殊位掩码;所以0x01只有最右边的位集,0x08只有从右边开始的第四个位集。通过使用按位AND运算符(
&
)测试给定字节与这些值,如果设置了位,则返回该值,否则返回零。如果要检查不同的位,而不是最右边的四位,则必须创建不同的位掩码。

关于规范 其他人提出了一个非常有效的观点:在Java中。也就是说,一个
字节中有8位。您需要定义如何将8位映射为4
布尔值;否则我们只能猜测你想干什么


位集上
然而,不管您如何进行这种映射,
boolean[]
不太可能真的是最好的表示。A可能更好。下面是一个例子:

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}"
    }
}
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]"
    }
}
另见
  • 有效Java第二版,第32项:使用
    EnumSet
    代替位字段

作为maerics答案的补充,如果需要,您可以将布尔数组转换回字节:

公共静态字节byteFromBooleanArray(bool[]\u boolArray)
{
字节x=0;
x+=\u boolArray[0]?(字节)1:(字节)0;
x+=\u boolArray[1]?(字节)2:(字节)0;
x+=\u boolArray[2]?(字节)4:(字节)0;
x+=\u boolArray[3]?(字节)8:(字节)0;
返回x;
}

您认为这种转换是如何发生的?一个字节包含八位。你想用四而扔掉四吗?一个字节中有八位。因此,除非保证字节值小于b1111,否则无法执行此操作。这是一个公平的假设吗?如果你知道自己感兴趣的是什么,这个答案几乎能告诉你你想要的一切。