在Java中,将位向量(布尔数组)转换为整数,将整数转换为位向量

在Java中,将位向量(布尔数组)转换为整数,将整数转换为位向量,java,android,bit-manipulation,bit,Java,Android,Bit Manipulation,Bit,取消发布以下函数的最佳方式是什么 // 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] } 或者有没有比传递布尔数组更好的方法呢 这在Android应用程序中出现

取消发布以下函数的最佳方式是什么

// 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]
}
或者有没有比传递布尔数组更好的方法呢

这在Android应用程序中出现,我们需要一个20个布尔值的数组来持久化,最简单的方法是在键值存储中写入一个整数或字符串

我将以我们(和我)写上述内容的方式作为答案。谢谢

改用。这比处理
boolean[]
要快得多

此外,您还应该问问自己,这20个
布尔值是否真的应该是
enum
,在这种情况下,您可以使用,这是C中位字段技术的Java解决方案(请参阅:有效Java第二版:使用
EnumSet
,而不是位字段)


BitSet
到/从
int
转换 您也可以使用
位集
并删除
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;
}
发件人:

这种表示非常紧凑和高效。这个类的空间和时间性能应该足够好,可以作为传统的基于
int
的“位标志”的高质量、类型安全的替代品

//将大端位向量转换为整数。
int位向量2int(布尔值[]b)
{
int x=0;

for(布尔i:b)x=x只要这两个函数彼此相反,它实际上对我们的应用程序并不重要。在下面的答案中,EnumSet是big endian.+1,还有书籍推荐。这是我最喜欢的书之一,我几乎不再用Java编程了。哇,回答得很好;谢谢!我不确定enum解决方案是否适合我们的应用程序n因为我们不想硬编码“20个布尔值的列表”中的20。实际上,我们真正做的是记住集合{1,…,20}的一个特定子集。@dreeves:然后使用
位集
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"
    }
}
// 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;
}