簡體   English   中英

在Java中將位向量(布爾數組)轉換為整數,並將整數轉換為位向量

[英]Convert bit vector (array of booleans) to an integer, and integer to bit vector, in Java

取消以下功能的最佳方法是什么?

// 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個布爾值的數組來持久化,而最簡單的方法是將一個整數或字符串寫入鍵值存儲。

我將以我們( Bee和我)寫上面的方式作為答案。 謝謝!

請改用java.util.BitSet 這比處理boolean[]要快得多。

另外,您應該真正問問自己,這20個boolean真的應該是enum ,在這種情況下,您可以使用EnumSet ,這是C語言中位域技術的Java解決方案(請參閱: 有效的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;
}

故意將兩種不同的技術用於教學目的。 為了魯棒性,從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"
    }
}

API中

這種表示非常緊湊和高效。 此類的時空性能應足夠好,以使其可以用作傳統的基於int的“位標志”的高質量,類型安全的替代方法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM