2012-04-02 8 views
3

Ich lese über einige Probleme, die über Optimierungsansätze sind.
In dem Problem, wie Sie Zahlen in einem bestimmten Bereich sortieren, besteht die Lösung darin, eine Bitmap zu verwenden. Und wenn eine Nummer z.B. Verwenden Sie bis zu 10 Mal halbe Bytes zum Abbilden der Zahlen und als Zähler die Anzahl der Vorkommen.
Das Konzept verstehe ich gut. Mein Problem ist es, dies in Java auf einfache Weise zu implementieren.Was ist der beste Weg, Java-Codierung für diese Art von Byte-Level-Operationen zu tun?

Ich bin auf Bit-Operationen fest.
Zum Beispiel für den ersten Teil von 1 die Zähler zu erhöhen, was könnte ich darüber nachdenken, war:

Suchen Sie die Byte
Z.B. bitValue[i]
Dann tun byte tmp = bitValue[i] & 0x0F, um die unteren Bits zu erhalten (wenn der Zähler der niedrige Zähler ist).
Dann tmp = tmp + 1 um 1 inkrementieren.
Dann tun bitValue[i] >> 2, um Low-End-Bits zu löschen und dann bitValue[i] <<2 wiederherzustellen. Jetzt haben wir die gleichen hohen Bits wie die ursprünglichen und die niedrigen Bits.
Dann bitValue[i] |= tmp setzen, um niedrige Bits zu setzen.
Jetzt bitValue hat der Low-Bit-Zähler um 1 inkrementiert. Richtig?

Für das obere Bit wäre es der gleiche Prozess, aber für die oberen Bits.

Dann wenn ich überprüfen muss, wie ist die Nummer des Zählers.

Ich dachte Bitmasken verwenden:
0x00x10x2 etc und verwenden OR zu überprüfen, was der aktuelle Zählernummer ist.

All diese scheinen zu kompliziert zu sein. Bin ich auf dem richtigen Weg? Wie werden diese Operationen am besten in der Java-Codierung angesprochen?

Jede Eingabe, Anleitung dazu ist sehr willkommen.

+0

Sie studieren Optimierung oder Optimierung? Wenn Sie tatsächlich optimieren, haben Sie ein Leistungsproblem festgestellt oder gehen Sie davon aus, dass das, was Sie tun, notwendig ist? FWIW, es ist wahrscheinlich nicht notwendig. – Dave

+0

@Dave: Ich studiere. – Cratylus

Antwort

3

Sie sind definitiv auf dem richtigen Weg. Hier ist ein ausgefüllter Code, der die ersten vier Bits oder die zweiten vier Bits eines int um einen bestimmten Betrag erhöht.

Beachten Sie, dass ich hier int statt byte verwenden. Selbst wenn Ihre Daten eine byte sind, ist es normalerweise viel einfacher, damit als int zu arbeiten. Dies liegt daran, java bitwise operators wie | und & und << zurück int. Es ist also am einfachsten, mit deinen Daten als int zu arbeiten und dann zurückzuschlagen, sobald du all dein Bit Twiddling gemacht hast.

Wenn Sie einen großen Datenblock (möglicherweise mehr als nur die beiden genannten Leistungsindikatoren) auf einer Bit-Ebene behandeln möchten, sollten Sie sich einen Blick auf BitSet werfen.

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: Vielen Dank für Ihr Beispiel !!!Ich bin froh zu wissen, dass ich darin nicht verloren bin. Und um zu überprüfen, was die Zählernummer ist, ist die Idee, jede Bitmaske zu überprüfen, z. '0x1'' 0x2' usw. eins nach dem anderen, um zu sehen, welche gesetzt ist, um zu wissen, welcher nuber im Zähler ist? – Cratylus

+0

'counter & 0x0F' liefert Ihnen den Wert des Low-Bit-Zählers und' (counter & 0xF0) >> 4' liefert Ihnen den Wert des High-Bit-Zählers. Oder sind das nicht die Zahlen, nach denen du suchst? – ulmangt

+0

Die Idee ist, dass, wenn ich "1" im Eingang haben würde der entsprechende Zähler um "1" erhöht werden würde. Wenn "1" 4 mal in den Eingangsdaten erscheint, würde der entsprechende Zähler den Wert "4" haben was das Inkrement tut, track tracks.) Später, wenn ich wissen möchte, wie viele '1' bei der Eingabe erschienen sind, muss ich irgendwie die Zahl' 4' vom Counter bekommen. I.e. das '1' erschien' 4' mal. Dafür dachte ich 'AND' mit jeder bitmask eins nach dem anderen. I.e. ist '0x1'? ist '0x2' im Zähler? ist '0x3' im Zähler? ist '0x4' im counter.Yes ist es' 0x4'.Ist das die richtige Methode? – Cratylus

Verwandte Themen