位操作对于数据压缩来说非常重要。在压缩和解压缩数据时,常常需要在小于一个字节的数量级上进行数据操作。因此,在讨论各种数据压缩方法之前,首先必须要熟悉一些对数据位进行的操作。这些操作非常重要,因为C语言本身只有一小部分内在的、不可分割的操作数。本节展示的方法包含了对任意位的缓冲区的操作。请注意,这里介绍的操作是相当不完整的。
int bit_get(const unsigned char *bits, int pos);
返回值:相应位所处的状态(1或0)。
描述:获取缓冲区bits中处于位置pos的位的状态。缓冲区最左边的位置为0。返回的状态值为0或1。
复杂度:O(1)
void bit_set(unsigned char *bits, int pos, int state);
返回值:无
描述:设置缓冲区bits中处于位置pos的位的状态(根据state值来设置)。缓冲区最左边的位置为0。状态值必须为0或1。
复杂度:O(1)
void bit_xor(const unsigned char *bits1, const unsigned char *bits2, unsigned char *bitsx, int size);
返回值:无
描述:按位计算两个缓冲区bits1与bits2的异或值,其中每个缓冲区包含size个位, 然后将结果返回bitsx中。按位异或的过程是将两个二进制操作数进行运算,如果操作数中处于位置i的两位相同,得到0;如果处于位置i的两位不同,则返回1。例如:11010⊕01011=10001 (⊕表示异或)。bitsx所需要的存储空间由函数调用者来管理。
复杂度:O(β),其中β为每个缓冲区中位的个数。
void bit_rot_left(unsigned char *bits, int size, int count);
返回值:无
描述:轮转缓冲区bits(含size位),将位值向左移count位。此操作完成后,处于最左端的count位移动到缓冲区最右端,而且其他的位也相应地轮转。
复杂度:O(nβ),其中β为每个缓冲区中位的个数,n为要轮转到左边的位数。