0

次の関数をスタブ解除するための最良の方法は何ですか?

// Convert a bit-vector to an integer. 
int bitvec2int(boolean[] b)
{
    [CODE HERE]
}

// Convert an integer x to an n-element bit-vector. 
boolean[] int2bitvec(int x, int n)
{
    [CODE HERE]
}

または、ブール配列を渡すよりも、そのようなことを行うためのより良い方法はありますか?

これは、永続化するために20ブール値の配列が必要なAndroidアプリで発生します。これを行う最も簡単な方法は、キー値ストアに整数または文字列を書き込むことです。

私たち(と私)が上記を書いた方法を答えとして投稿します。ありがとう!

4

2 に答える 2

9

java.util.BitSet代わりに使用してください。を処理するよりもはるかに高速ですboolean[]

また、これらの20booleanが本当に必要かどうかを自問する必要がenumあります。その場合EnumSetは、Cのビットフィールド手法に対するJavaソリューションであるを使用できます(「効果的なJava 2nd Edition:EnumSetビットフィールドの代わりに使用」を参照)。


BitSetint変換へ/から

を使用BitSetして削除するintこともできますが、これらが必要な場合に備えて:

static BitSet toBitSet(int i) {
    BitSet bs = new BitSet(Integer.SIZE);
    for (int k = 0; k < Integer.SIZE; k++) {
        if ((i & (1 << k)) != 0) {
            bs.set(k);
        }
    }
    return bs;
}
static int toInt(BitSet bs) {
    int i = 0;
    for (int pos = -1; (pos = bs.nextSetBit(pos+1)) != -1; ) {
        i |= (1 << pos);
    }
    return i;
}

教育目的で、2つの異なる手法が意図的に使用されました。堅牢性を確保するために、BitSettoint変換では32ビットで十分であることを確認する必要があります。


EnumSet

この例は、本に記載されている例に基づいています。

import java.util.*;
public enum Style {
    BOLD, ITALIC, UNDERLINE, STRIKETHROUGH;

    public static void main(String[] args) {
        Set<Style> s1 = EnumSet.of(BOLD, UNDERLINE);
        System.out.println(s1); // prints "[BOLD, UNDERLINE]"

        s1.addAll(EnumSet.of(ITALIC, UNDERLINE));
        System.out.println(s1.contains(ITALIC)); // prints "true"
    }
}

APIから:

この表現は非常にコンパクトで効率的です。このクラスの空間と時間のパフォーマンスは、従来のint「ビットフラグ」に代わる高品質でタイプセーフな代替手段として使用できるほど十分に優れている必要があります。

于 2010-05-08T16:38:23.463 に答える
1
// Convert a big-endian bit-vector to an integer. 
int bitvec2int(boolean[] b)
{
    int x = 0;
    for(boolean i : b) x = x << 1 | (i?1:0);
    return x;
}

// Convert an integer x to an n-element big-endian bit-vector. 
boolean[] int2bitvec(int x, int n)
{
    boolean[] b = new boolean[n];
    for(int i = 0; i < n; i++) b[i] = (1 << n-i-1 & x) != 0;
    return b;
}
于 2010-05-08T16:38:39.103 に答える