设为首页 加入收藏

TOP

数据压缩的重要组成部分---位操作(二)
2018-08-06 10:54:49 】 浏览:308
Tags:数据 压缩 重要 组成部分 ---位 操作
bits2进行按位异或运算,并将计算的结果放到缓冲区bitsx中。要做到这一点,将bits1中第i个位置的位与bits2中第i个位置的位进行比较,如果位值相同,将第i个位置的位置为0;否则,将第i个位置的位置为1。这个过程持续下去直到缓冲区中size指定的每个位都计算完成。


bit_xor的时间复杂度为O(B),其中B是每个缓冲区中的位数。这是因为此操作要在每个位上循环迭代一次。


bit_rot_left


bit_rot_left将缓冲区指定数量的位向左轮转。首先,保存最左端字节的最左端的位,然后向左一位一位地移动每个字节的位值。在移动字节的过程中,将前一个字节最右边的位移动到当前字节的最左边。当处理到最后一个字节时,将其最右边的位移动到首字节的最高位上。这个过程一直持续下去直到所有的位都轮转到位。


bit_rot_left的时间复杂度为O(nB),其中n为要向左轮转的位的个数,B是缓冲区中位的个数。这是因为,对于每次轮转,要进行(B/8)+1次移动。


 示例:位操作的实现


/*bit.c  位操作的实现*/
#include <stdlib.h>


#include "bit.h"


/*bit_get  获取缓冲区bits中处于pos位的状态*/
int bit_get(const unsigned char *bits, int pos)
{
    unsigned char  mask;
    int            i;


    /*设置掩码*/
    mask = ox80;
    for(i=0; i<(pos % 8); i++)
        mask = mask >> 1;
    /*用位与运算获取对应的位*/
    return (((mask & bits[(int)(pos / 8)]) == mask)? 1:0)
}
/*bit_set  设置缓冲区bits中位于pos位的状态*/
void bit_set(unsigned char *bits, int pos, int state)
{
    unsigned char mask;
    int          i;


    /*设置掩码*/
    mask = ox80;
    for(i=0; i<(pos % 8); i++)
        mask=mask>>1;


    /*依据state设置位*/
    if(state)
        bits[pos/8] = bits[pos/8] | mask;
    else
        bits[pos/8] = bits[pos/8] & (~mask);


    return;
}
/*bit_xor  按位异或运算*/
void bit_xor(const unsigned char *bits1,const unsigned char *bits2,unsigned char *bitsx,int size)
{
    int i;
    /*计算两个缓冲区的按位异或*/
    for(i=0;i<size;i++)
    {
        if(bit_get(bits1,i) != bit_get(bits2,i))
            bit_set(bitsx,i,1);
        else
            bit_set(bitsx,i,0);
    }
    return;
}
/*bit_rot_left 轮转缓冲区bits(含size位),将位值向左移count位*/
void bit_rot_left(unsigned char *bits,int size,int count)
{
    int  fbit,lbit,i,j;


    /*将缓冲区向左轮转指定位数*/
    if(size > 0)
    {
        for(j=0; j<count; j++)
        {
            for(i=0; i<=((size-1)/8); i++)
            {
                /*获得要从当前字节偏移的位*/
                lbit = bit_get(&bit[i],0);
                if(i==0)
                {
                    /*保存要从首字节移动到后面的位*/
                    fbit = lbit;
                }
                else
                {
                    /*将前一字节最右边的位设置为当前字节最左边的位*/
                    bit_set(&bits[i-1],7,lbit);
                }


                /*将当

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇数据压缩算法---霍夫曼编码的分析.. 下一篇Python 3.6 的 venv 模块

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目