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

dre*_*ves 0 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]
}
Run Code Online (Sandbox Code Playgroud)

或者有没有比传递布尔数组更好的方法呢?

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

我将发布我们(蜜蜂和我)写上面作为答案的方式.谢谢!

pol*_*nts 9

java.util.BitSet改用.它比处理要快得多boolean[].

此外,您应该问自己这些20 boolean是否应该是enum,在这种情况下您可以使用EnumSet,这是来自C的位字段技术的Java解决方案(请参阅:Effective Java 2nd Edition:使用EnumSet而不是位字段).


BitSet来自int转换

您也可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

故意将两种不同的技术用于教学目的.用于鲁棒性,在BitSetint转换应确保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"
    }
}
Run Code Online (Sandbox Code Playgroud)

来自API:

这种表现非常紧凑和高效.这个类的空间和时间性能应该足以使其成为传统int的"位标志" 的高质量,类型安全的替代品.