繁体   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