簡體   English   中英

將布爾值標志與每個可能的整數值關聯的最快方法是什么?

[英]What is the fastest way to associate a boolean flag to every possible integer value?

如果我有一個字節而不是一個整數,則可以輕松地創建一個具有256個位置的布爾數組並檢查:

boolean[] allBytes = new boolean[256];

if (allBytes[value & 0xFF] == true) {
   // ...
}

因為我有一個整數,所以我不能有一個大小為20億的數組。 檢查整數是真還是假的最快方法是什么? 一組整數? 哈希表?

編輯1:我想為每個可能的整數(20億)關聯一個真或假標志。

EDIT2:我有ID X(整數),我需要一種快速的方法來知道ID X是ON還是OFF。

BitSet無法處理負數。 但是有一個簡單的方法可以解決:

class BigBitSet {
    private final BitSet[] bitSets = new BitSet[] {new BitSet(), new BitSet()};

    public boolean get(int bitIndex) {
        return bitIndex < 0 ? bitSets[1].get(~bitIndex)
                : bitSets[0].get(bitIndex);
    }

    ...
}

第二個BitSet用於負數,它通過'〜'運算符進行轉換(這也比簡單地取反更好,因為它也適用於Integer.MIN_VALUE )。

內存消耗可能高達4 Gib,即大約524 MB。

我什至對此不屑一顧。

您的計算機可以存儲的最小信息量對嗎? 一個位有兩個狀態,您想要兩個狀態,因此,只需說bit = 0為false和bit = 1為true。

因此,您需要盡可能多的位,即2 ^ 32 = 4,294,967,296。 您可以將8位裝入一個字節,因此只需要2 ^ 32/8 = 536,870,912字節。

從那里很容易地跟隨代碼來尋址字節中的每個位...

 byte[] store = new byte[1 << 29]; // 2^29 bytes provide 2^32 bits

 void setBit(int i) {
     int byteIndex = i >>> 3;
     int bitMask = 1 << (i & 7);
     store[byteIndex] |= bitMask;
 }

 boolean testBit(int i) {
     int byteIndex = i >>> 3;
     int bitMask = 1 << (i & 7);
     return (store[byteIndex] & bitMask) != 0;
 }

java.util.BitSet實際上在一個不錯的類中提供了相同的預制,只有您可以使用它來存儲最多2 ^ 31位,因為它不適用於負位索引。

由於您使用的是Java,因此請使用BitSet。 快速簡便。 如果願意,還可以使用原始long數組或BigInteger數組,但這確實是BitSet的目的。

http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

暫無
暫無

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

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