2017-11-19 7 views
1

Ich arbeite gerade an einem Dateikompressor basierend auf Huffman-Decodierung. Also ich habe einen Baum Decodierung wie folgt:Wie manipuliert man Bits in Smalltalk?

enter image description here

und ich habe diesen Baum auf eine Ausgabedatei codieren, indem eine bestimmte Kriterien folgende:

„für jedes Blatt, schreiben ein 0-Bit, gefolgt von den 8 Bits von das entsprechende Zeichen.Schreibe die Bits in der Reihenfolge Bit 7, Bit 6, ..., Bit 0, das ist High-Bit zuerst.Als Sonderfall, wenn das Byte 0 ist, schreibe auf Bit 8, das eine 0 für einen Byte-Wert von 0 und 1 für einen Byte-Wert von 256 (der EOF-Markierung) sein wird. Schreiben Sie für einen internen Knoten einfach ein Bit 1.

Also was ich vorhabe ist, ein Bit-Array zu erstellen und fügen Sie die entsprechenden Bits im angegebenen Format hinzu. Das Problem ist, dass ich nicht weiß, wie man eine Zahl in Smalltalk in binary umwandelt.

Zum Beispiel, wenn ich das erste Blatt verschlüsseln möchte, würde ich etwas wie 01101011, d. H. 0 gefolgt von der Bit-Darstellung von k tun und dann jedes Bit einzeln in das Array einfügen.

Antwort

3

Ich weiß nicht, welchen Dialekt Sie genau verwenden, aber im Allgemeinen können Sie auf die Bits von Integer zugreifen. Sie werden so modelliert, als ob die Darstellung in Zweiergänzung mit einer unendlichen Bitfolge wäre.

2 is ....0000000000010 
1 is ....0000000000001  
0 is ....0000000000000 with infinitely many 0 on the left 
-1 is ....1111111111111 with infinitely many 1 on the left 
-2 is ....1111111111110 

Dies gilt auch für LargeIntegers, obwohl sie in der Regel als Zeichen Größe implementiert werden (die Klasse kodiert die Zeichen), Zwei-Komplement wird emuliert werden.

Dann können Sie mit BITAND arbeiten: BITOR: BITXOR: bitInvert Bitshift :, und in einigen Aromen Bitat: setzen:

Sie können die Bits Zugriff mit (2 Bitat: index), wobei der Index bei 1 beginnt für niedrigstwertiges Bit oder wächst höher. Wenn es fehlt, implementieren Sie es mit bitAnd: und BitShift: ...

Für positiv, können Sie für den Rang von High-Bit (2 highBit) fragen.

Alle diese Operationen sollten eine neue Ganzzahl erzeugen (es ist keine Änderung vor Ort möglich).

Konzeptionell ist ein ByteArray eine Sammlung von vorzeichenlosen Ganzzahlen auf 8 Bits (zwischen 0 und 255), so dass Sie ein Bit-Array mit ihnen implementieren können (wenn es nicht bereits im Dialekt existiert). Oder Sie können eine Ganzzahl verwenden (aber nicht in der Lage, die Größe zu kontrollieren, die unendlich sein wird, noch an Ort und Stelle, die Operationen werden eine Kopie kosten).

+1

Und es ist wahrscheinlich klug, BitStream auch zu implementieren, wenn nicht im Dialekt verfügbar. Ist es nicht? –

+0

Ja, ein BitStream wird besonders für die Kodierung/Dekodierung nützlich sein –