簡體   English   中英

如何操作Smalltalk中的位?

[英]How to manipulate bits in Smalltalk?

我目前正在研究基於霍夫曼解碼的文件壓縮器。 所以我有一個像這樣的解碼樹:

在此輸入圖像描述

我必須按照一定的標准在輸出文件上編碼這個樹:

“對於每個葉子,寫出一個0位,然后寫出相應字符的8位。按順序位7,位6,...,位0寫出位,即高位優先。作為特殊位例如,如果字節為0,則寫出位8,對於字節值0將為0,對於字節值為256(EOF標記)將為1。 對於內部節點,只需寫入1。

所以我打算做的是創建一個位數組並添加指定格式的相應位。 問題是我不知道如何在smalltalk中將數字轉換為二進制。

例如,如果我想編碼第一個葉子,我想做一些像01101011,即0后跟k的位表示然后將每個位逐個添加到數組中。

我不知道你正在使用哪種方言,但一般來說,你可以訪問Integer的位。 它們被建模為好像表示是雙補碼的,具有無限的位序列。

 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

對於LargeIntegers也是如此,即使它們通常被實現為符號幅度(類對符號進行編碼),也將模擬雙補碼。

然后你可以使用bitAnd:bitOr:bitXor:bitInvert bitShift :,以及某些風格的bitAt:put:

您可以使用(2 bitAt:index)訪問位,其中索引從1開始,用於最低有效位,或者增長更高。 如果它丟失了,用bitAnd:和bitShift實現它:...

對於正數,您可以要求高位(2 highBit)的等級。

所有這些操作都應該創建一個新的整數(沒有可能的修改)。

從概念上講,ByteArray是8位(0到255之間)的無符號整數的集合,因此您可以使用它們實現位數組(如果方言中尚不存在)。 或者您可以使用整數(但無法控制無限大小,也不能使用mofifications,操作將花費一份副本)。

暫無
暫無

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

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