8

Javaで1バイトを4ブール値の配列に変換する必要があります。どうすればこれを行うことができますか?

4

3 に答える 3

12

あなたの質問に対するMichaelPetrottaのコメントによると、8ビットバイトのどのビットを結果のブール配列に対してテストするかを決定する必要があります。デモンストレーションの目的で、右端の4ビットが必要であると仮定すると、次のように機能するはずです。

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

この例の16進値(、、0x01など0x02)は、目的の場所に1つのビットのみが設定されている特別なビットマスクです。したがって、0x01には右端のビットのみが設定され、0x08には右から4番目のビットのみが設定されます。ビット単位のAND演算子()を使用してこれらの値に対して指定されたバイトをテストすることにより&、ビットが設定されている場合はその値を取得し、設定されていない場合はゼロを取得します。右端の4つ以外の異なるビットをチェックする場合は、異なるビットマスクを作成する必要があります。

于 2010-06-17T00:53:54.050 に答える
5

仕様上

他の人は非常に有効な点を提起しています.Javaでは、Byte.SIZE == 8. つまり、a には 8 ビットありbyteます。boolean8 ビットを 4 つの値にマップする方法を定義する必要があります。そうでなければ、あなたが何をしようとしているのかを推測することしかできません。


の上BitSet

ただし、このマッピングをどのように行うかに関係なく、それがboolean[]実際に最適な表現である可能性は低いです。Aの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}"
    }
}

上記のコードは、標準のビット プローブ手法を使用して abyteを aに変換しBitSetます。(byte) 10aにはビット 1 と 3 が設定されていることに注意してください(つまり10 = 2^1 + 2^3、ここで^は累乗を示します)。

orこの例は、 に対して/set ユニオン操作を実行する方法も示していますBitSet


の上EnumSet

おそらく別の適用可能なデータ構造は です。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]"
    }
}

こちらもご覧ください

  • 有効な Java 2nd Edition、項目 32:EnumSetビット フィールドの代わりに使用
于 2010-06-17T12:12:47.460 に答える