2012-04-02 16 views
3

我在閱讀有關優化方法的一些問題。
在如何對特定範圍內的數字進行排序的問題中,解決方案是使用位圖。如果一個數字可以出現,例如多達10次使用半字節來映射數字和作爲計數器來表示出現的次數。
我理解的概念很好。我的問題是如何以直接的方式在Java中實現這一點。對這些類型的字節級操作執行java編碼的最佳方法是什麼?

我被困在位操作上。
例如,對於第一部分遞增1櫃檯,我能想到的是:

找到字節
例如bitValue[i]
然後做byte tmp = bitValue[i] & 0x0F得到低位(如果計數器是低位計數器)。
然後做tmp = tmp + 1增加1.
然後做bitValue[i] >> 2來清除低端位然後bitValue[i] <<2來恢復。現在我們具有與原始相同的高位,並且清除低位。
然後做bitValue[i] |= tmp設置低位。
現在bitValue的低位計數器加1。

對於高位,它將是相同的過程,但高位。

然後,當我必須檢查計數器的數量是多少。

我想使用位掩碼:
0x00x10x2等,並使用OR檢查什麼是當前的計數值。

所有這些看起來都太複雜了。我在正確的軌道上嗎?這些操作在Java編碼中如何最好地解決?

任何輸入,對此的指導是非常受歡迎的。

+0

您是在學習優化還是優化?如果你真的在進行優化,你是否發現了一個性能問題,或者你認爲你正在做什麼是必要的? FWIW,這可能沒有必要。 – Dave 2012-04-02 20:51:57

+0

@Dave:我在讀書。 – Cratylus 2012-04-03 15:51:01

回答

3

你絕對是在正確的軌道上。這裏有一些充實的代碼,它將int的前4位或後4位遞增給定量。

請注意,我在此使用int而不是byte。即使你的數據是byte,它通常也比int更容易處理。這是因爲java bitwise operators|&<<返回int。因此,最簡單的方法是將數據作爲int處理,然後在您完成所有工作後進行回退。另外,如果您需要在每位級別處理大量數據(可能不僅僅是您提到的兩個計數器),您可以考慮看一下BitSet

public class Test { 
    public static void main(String[] args) 
    { 
     int counter = 0; 

     // increment the low bits by 3 and high bits by 2 
     counter = addLowBits(counter, 3); 
     counter = addHighBits(counter, 2); 

     // print the hex string to verify 
     System.out.println(Integer.toHexString(counter)); 
     System.out.println("Low Counter: " + (counter & 0x0F)); 
     System.out.println("High Counter: " + ((counter & 0xF0) >> 4)); 
    } 

    public static int addLowBits(int counter, int increment) 
    { 
     // get the low bits 
     int low = counter & 0x0F; 

     // increment by 1 
     low = low + increment; 

     // mask the high bits and insert new low bits 
     counter = (counter & 0xF0) | low; 

     return counter; 
    } 

    public static int addHighBits(int counter, int increment) 
    { 
     // now get high bits 
     int high = (counter & 0xF0) >> 4; 

     // increment by 1 
     high = high + increment; 

     // mask the low bits and insert new high bits 
     counter = (counter & 0x0F) | (high << 4); 

     return counter; 
    } 
} 
+0

+1:謝謝你的例子!很高興知道我不會迷失在此。爲了檢查什麼是計數器號碼,我們的想法是檢查每個位掩碼,例如, 「0x1」,「0x2」等一個一個地看,看看是哪個設置的,以便知道哪個節點在計數器中? – Cratylus 2012-04-02 20:04:43

+0

'計數器&0x0F'得到你的低位計數器的值,'(計數器&0xF0)>> 4'得到你高位計數器的值。還是那些不是你要找的數字? – ulmangt 2012-04-02 20:08:09

+0

這個想法是,如果我在輸入中有'1',相應的計數器會增加'1'。如果在輸入數據中出現4次'1',那麼相應的計數器就會有值'4'(這是跟蹤發生的次數)。後來當我想知道輸入中出現了多少'1'時,我必須以某種方式從計數器中得到數字'4'。即'1'出現了'4'次。爲此,我認爲每個位掩碼一個接一個地與'AND'。即是'0x1'?在計數器中是'0x2'嗎?在計數器中是0x3嗎?在計數器中是'0x4',是'0x4'。這是正確的方法嗎? – Cratylus 2012-04-02 20:12:26

相關問題