2011-04-18 130 views
1

在Java中,您可以創建一個大小爲8的BitSet並將其存儲爲字節以便輸出它?有關BitSets的文檔沒有提及它。那是不是意思?將BitSet設置爲原始類型?

+0

似乎是很明顯的功能,不知道爲什麼它WASN不包含在jdk中。 – jtahlborn 2011-04-18 18:02:26

+0

由於基元不是對象,因此您無法將對象轉換爲基元。 – 2011-04-18 18:05:13

+1

@Steve郭 - 他沒有要求鑄造。你可以像BitSet.asByte()那樣返回一個包含前8位的字節。 (就此而言,自動拆箱_does_允許您將某些對象投射到基元)。 – jtahlborn 2011-04-18 18:15:16

回答

5

您不能將BitSet轉換爲byte

你可以編寫代碼來做你想做的事情。給定一個名爲BitSetbits,在這裏你去:

byte output = 0; 
for (int i = 0; i < 8; i++) { 
    if (bits.get(i)) { 
     output |= 1 << (7 - i); 
    } 
} 

更新:上面的代碼假定您的位索引0到7從左至右。例如。假設位01101001您認爲位0是最左邊的0.如果您要從右向左分配位,則位0將是最右邊的1.在這種情況下,您需要替換爲output |= 1 << i

+0

你能解釋一下這行輸出| = 1 <<(7 - i); – 2011-04-18 18:19:41

+2

@Trevor這顯然是一個不快樂的人遭到斷頭臺的襲擊。 :-) Nah,'| ='表示「或等於」,或者「output = output |」 1 <<(7 - i)'。現在'1 <<(7-1)'部分表示取1並將其移過來。所以你基本上說「把輸出的第i位設置爲1」。 – corsiKa 2011-04-18 18:24:26

+1

'| ='取最後一個'輸出',並對它和'1 <<(7 - i)'執行按位或運算。本質上它是手動設置「輸出」字節的位。 – WhiteFang34 2011-04-18 18:26:05

2

沒有什麼內置的。你明顯可以實現這一點。

0

比特集合是比特

陣列JVM使用一個32位的堆單元即在JVM中存儲一個32位的地址的每個寄存器

我們知道原始布爾值被設置爲1但處理爲32位。布爾的陣列將被認爲是字節陣列

在BitSet中的比特組中的每個組件具有一個布爾值

每個位組具有電流的大小, 這是空間的比特數 當前正在使用的位集。注意 表示該大小與 執行一個位集有關,因此可能 隨實現而改變。位集合的長度爲 涉及位集合的邏輯長度爲 ,並且與實現無關地定義爲 。

+0

這不是我的問題的真正答案,看看我已經知道什麼是BitSet是 – 2011-04-18 18:12:52

+0

BitSet不使用布爾值。它使用多頭。 – corsiKa 2011-04-18 18:13:02

+0

http://download.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html – zudokod 2011-04-18 18:17:09

-1

BitSet類顯然不是意圖將其位導出或導入本機數據類型,而且如果您只是想處理單個字節的固定大小,那麼也很沉重。如果你只是想獨立操作一個字節的位,然後使用結果字節,那麼它可能不是你所需要的。看來你可能只是想用這樣的API:

SimpleBitSet bs = new SimpleBitSet('A'); 
bs.setBit(5); 
byte mybyte = bs.getByte(); 

所以這樣的簡化位set的實現看起來是這樣的:

public class SimpleBitSet 
{ 
    private byte bits; 

    public SimpleBitSet(int bits) 
    { 
     this.bits = (byte) bits; 
    } 

    public byte getByte() 
    { 
     return bits; 
    } 

    public boolean getBit(int idx) 
    { 
     checkIndex(idx); 
     return (bits & (1 << idx)) != 0; 
    } 

    public void setBit(int idx) 
    { 
     checkIndex(idx); 
     bits |= 1 << idx; 
    } 

    public void clearBit(int idx) 
    { 
     checkIndex(idx); 
     bits &= ~(1 << idx); 
    } 

    protected void checkIndex(int idx) 
    { 
     if(idx < 0 || idx > 7) 
      throw new IllegalArgumentException("index: " + idx); 
    }  
}