亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? binary_codec.cpp

?? 惠普實驗室的經典代碼。用于huffman編碼的快速實現
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//                                                                           -
//                       *************************                           -
//                        HUFFMAN CODING EXAMPLES                            -
//                       *************************                           -
//                                                                           -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//                                                                           -
//   Implementation of periodic-adaptive and static Huffman codes            -
//                                                                           -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//                                                                           -
// Version 1.00  -  January 24, 2005                                         -
//                                                                           -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//                                                                           -
//                                  WARNING                                  -
//                                 =========                                 -
//                                                                           -
// The only purpose of this program is to demonstrate the basic principles   -
// of Huffman codes. It is provided as is, without any express or implied    -
// warranty, without even the warranty of fitness for any particular         -
// purpose, or that the implementations are correct.                         -
//                                                                           -
// Permission to copy and redistribute this code is hereby granted, provided -
// that this warning and copyright notices are not removed or altered.       -
//                                                                           -
// Copyright (c) 2005 by Amir Said (said@ieee.org) &                         -
//                       William A. Pearlman (pearlw@ecse.rpi.edu)           -
//                                                                           -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


// - - Inclusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

#include <stdlib.h>
#include <string.h>
#include "binary_codec.h"


// - - Constants - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

// #define TREE_DECODE

const unsigned HC__MaxCount = 1 << 15;  // Max. symbol count for adaptive code


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Static functions  - - - - - - - - - - - - - - - - - - - - - - - - - - -

static void HC_Error(const char * msg)
{
  fprintf(stderr, "\n\n -> Huffman/binary coding error: ");
  fputs(msg, stderr);
  fputs("\n Execution terminated!\n", stderr);
  exit(1);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

static void Form_Huffman_Tree(int number_of_symbols,
                              unsigned original_count[],
                              int left_branch[],
                              int right_branch[])
{
  int tc, ts, i, n, nc, it = 0, k = (number_of_symbols >> 1) + 1;
  int * count = right_branch - 1, * symbol = left_branch - 1;

  for (n = k - 1; n < number_of_symbols; n++) {     // second half of the heap
    symbol[n+1] = n;
    count[n+1]  = original_count[n];
  }

  for (;;) {
    if (k > 1) {
      ts = (--k) - 1;                                // add first half to heap
      tc = original_count[ts];
    }
    else
      if ((++it) & 1) {
        tc = count[n];
        ts = symbol[n];
        left_branch[--n] = symbol[1];                  // set-up merging nodes
        if (n == 1) break;
        nc = count[1];
      }
      else {
        right_branch[n] = symbol[1];                 // finalize merging nodes
        ts = -n;
        tc = nc + count[1];
      }
    for (int j = (i = k) << 1; j <= n; j += (i = j)) {            // heap sort
      if ((j < n) && (count[j] > count[j+1])) ++j;
      if (tc <= count[j]) break;
      symbol[i] = symbol[j];
      count[i]  = count[j];
    }
    symbol[i] = ts;
    count[i]  = tc;
  }
  right_branch[1] = ts;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

static void Set_Huffman_Code(int * tree[2],
                             unsigned codeword[],
                             unsigned codeword_length[])
{
  int stack[32], node, depth = 0, current_code = 0;

  for (stack[0] = 1; depth >= 0;) {       // transverse tree setting codewords

    if ((node = tree[current_code&1][stack[depth]]) < 0)
      do {
        current_code <<= 1;
        stack[++depth] = -node;
      } while ((node = tree[0][-node]) < 0);

    codeword[node] = current_code;              // set codeword to leaf symbol
    codeword_length[node] = depth + 1;

    while (current_code & 1) {                                    // backtrack
      current_code >>= 1;
      if (--depth < 0) break;
    }
    current_code |= 1;
  }
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

static void Set_Huffman_Code(int table_bits,
                             int * tree[2],
                             int decoder_table[],
                             unsigned codeword[],
                             unsigned codeword_length[])
{
  int stack[32], node, depth = 0, current_code = 0;

  for (stack[0] = 1; depth >= 0;) {       // transverse tree setting codewords

    if ((node = tree[current_code&1][stack[depth]]) < 0)
      do {
        if (depth + 1 == table_bits) decoder_table[current_code] = node;
        current_code <<= 1;
        stack[++depth] = -node;
      } while ((node = tree[0][-node]) < 0);

    codeword[node] = current_code;              // set codeword to leaf symbol
    int nb = codeword_length[node] = depth + 1;

    if (nb <= table_bits)                      // add entries to decoder table
      if (nb == table_bits)
        decoder_table[current_code] = node;
      else {
        int db = table_bits - nb, sc = current_code << db;
        for (int k = 1 << db; k;) decoder_table[sc+--k] = node;
      }

    while (current_code & 1) {                                    // backtrack
      current_code >>= 1;
      if (--depth < 0) break;
    }
    current_code |= 1;
  }
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Coding implementations  - - - - - - - - - - - - - - - - - - - - - - - -

unsigned Binary_Codec::get_bit(void)
{
#ifdef _DEBUG
  if (mode != 2) HC_Error("decoder not initialized");
#endif
                                            // refill bit buffer (32-bit word)
  while (bit_position >= 8) {
    bit_buffer |= unsigned(*bc_pointer++) << (bit_position -= 8);
  }
                       // next data bit is most-significant bit in 32-bit word
  ++bit_position;
  unsigned data = bit_buffer >> 31;
  bit_buffer <<= 1;
  return data;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

unsigned Binary_Codec::get_bits(unsigned bits)
{
#ifdef _DEBUG
  if (mode != 2) HC_Error("decoder not initialized");
  if ((bits < 1) || (bits > 24)) HC_Error("invalid number of bits");
#endif
                                            // refill bit buffer (32-bit word)
  while (bit_position >= 8) {
    bit_buffer |= unsigned(*bc_pointer++) << (bit_position -= 8);
  }
                    // next data bits are most-significant bits in 32-bit word
  bit_position += bits;
  unsigned data = bit_buffer >> (32 - bits);
  bit_buffer <<= bits;
  return data;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::put_bit(unsigned bit)
{
#ifdef _DEBUG
  if (mode != 1) HC_Error("encoder not initialized");
#endif
                      // save data bit in most-significant bits of 32-bit word
  --bit_position;
  if (bit) bit_buffer |= 1U << bit_position;
  if (bit_position <= 24)                    // empty bit buffer (32-bit word)
    do {
      *bc_pointer++ = (unsigned char) (bit_buffer >> 24);
      bit_buffer <<= 8;
    } while ((bit_position += 8) <= 24);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::put_bits(unsigned data,
                            unsigned bits)
{
#ifdef _DEBUG
  if (mode != 1) HC_Error("encoder not initialized");
  if ((bits < 1) || (bits > 24)) HC_Error("invalid number of bits");
  if (data >= (1U << bits)) HC_Error("invalid data");
#endif
                     // save data bits in most-significant bits of 32-bit word
  bit_buffer |= data << (bit_position -= bits);
  if (bit_position <= 24)                    // empty bit buffer (32-bit word)
    do {
      *bc_pointer++ = (unsigned char) (bit_buffer >> 24);
      bit_buffer <<= 8;
    } while ((bit_position += 8) <= 24);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::encode(unsigned data,
                          Static_Huffman_Code & C)
{
#ifdef _DEBUG
  if (mode != 1) HC_Error("encoder not initialized");
  if (data >= C.data_symbols) HC_Error("invalid data symbol");
#endif

  bit_buffer |= C.codeword[data] << (bit_position -= C.length[data]);  // code
  if (bit_position <= 24)
    do {                                                   // save bytes ready
      *bc_pointer++ = (unsigned char) (bit_buffer >> 24);
      bit_buffer <<= 8;
    } while ((bit_position += 8) <= 24);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::encode(unsigned data,
                          Adaptive_Huffman_Code & C)
{
#ifdef _DEBUG
  if (mode != 1) HC_Error("encoder not initialized");
  if (data >= C.data_symbols) HC_Error("invalid data symbol");
#endif

  bit_buffer |= C.codeword[data] << (bit_position -= C.length[data]);  // code
  if (bit_position <= 24)
    do {                                                   // save bytes ready
      *bc_pointer++ = (unsigned char) (bit_buffer >> 24);
      bit_buffer <<= 8;
    } while ((bit_position += 8) <= 24);

  ++C.symbol_count[data];                          // update symbol statistics
  if (--C.symbols_until_update == 0) C.update(true);    // periodic adaptation
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

#ifdef TREE_DECODE

unsigned Binary_Codec::decode(Static_Huffman_Code & C)
{
#ifdef _DEBUG
  if (mode != 2) HC_Error("decoder not initialized");
#endif

  while (bit_position >= 8)                                     // fill buffer
    bit_buffer |= unsigned(*bc_pointer++) << (bit_position -= 8);

  int data = -1;

  do {
    data = C.tree[bit_buffer>>31][-data];               // bit-by-bit decoding
    bit_buffer <<= 1;
  } while (data < 0);

  bit_position += C.length[data];

  return data;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

unsigned Binary_Codec::decode(Adaptive_Huffman_Code & C)
{
#ifdef _DEBUG
  if (mode != 2) HC_Error("decoder not initialized");
#endif

  while (bit_position >= 8)                                     // fill buffer
    bit_buffer |= unsigned(*bc_pointer++) << (bit_position -= 8);

  int data = -1;

  do {
    data = C.tree[bit_buffer>>31][-data];               // bit-by-bit decoding
    bit_buffer <<= 1;
  } while (data < 0);

  bit_position += C.length[data];

  ++C.symbol_count[data];                          // update symbol statistics
  if (--C.symbols_until_update == 0) C.update(false);   // periodic adaptation

  return data;
}

#else

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

unsigned Binary_Codec::decode(Static_Huffman_Code & C)
{
#ifdef _DEBUG
  if (mode != 2) HC_Error("decoder not initialized");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费毛片app| 久久久久久一级片| 欧美二区三区91| 欧美亚洲动漫另类| 色婷婷亚洲综合| 色欧美片视频在线观看在线视频| 成人va在线观看| av亚洲精华国产精华精| 91在线国内视频| 日本韩国精品在线| 欧美亚洲综合色| 欧美日韩高清一区二区| 在线观看91精品国产麻豆| 在线播放视频一区| 日韩欧美一区二区免费| 久久综合九色综合欧美就去吻| 久久综合九色综合欧美98| 国产欧美日韩另类一区| 国产精品第一页第二页第三页| 中文字幕字幕中文在线中不卡视频| 最新高清无码专区| 亚洲一区二区在线观看视频| 日韩激情在线观看| 国模冰冰炮一区二区| 岛国一区二区在线观看| 欧美在线你懂得| 欧美一区二区网站| 亚洲国产精品t66y| 亚洲精品免费在线观看| 午夜精品久久久久久久99樱桃 | 热久久免费视频| 国产真实乱对白精彩久久| 国产1区2区3区精品美女| 99re8在线精品视频免费播放| 欧洲av一区二区嗯嗯嗯啊| 欧美一级一区二区| 久久青草国产手机看片福利盒子| 国产精品私人影院| 亚洲成人午夜电影| 国产精品性做久久久久久| 色婷婷香蕉在线一区二区| 91精品国产综合久久小美女| 久久综合国产精品| 一区二区激情小说| 国产精品一区二区三区99| 在线观看免费成人| 国产欧美精品一区二区色综合| 亚洲一区二区欧美日韩| 国产精品99久久久久久久vr| 91电影在线观看| 久久久久久久久久美女| 亚洲大型综合色站| 成人小视频在线| 91精品国产免费| 亚洲品质自拍视频| 国产又粗又猛又爽又黄91精品| 色婷婷国产精品久久包臀| 精品国产伦一区二区三区观看方式| 日韩一区在线播放| 精品亚洲国产成人av制服丝袜 | 日韩久久久精品| 亚洲日本在线天堂| 久久99精品国产麻豆婷婷洗澡| av男人天堂一区| 精品免费一区二区三区| 亚洲欧美日韩在线不卡| 国产真实乱偷精品视频免| 欧美日本在线看| 亚洲乱码国产乱码精品精的特点| 黄色资源网久久资源365| 欧美三级日韩三级| 自拍视频在线观看一区二区| 精品一区二区免费看| 欧美区视频在线观看| 亚洲欧美日韩精品久久久久| 国产一区三区三区| 日韩欧美一区二区三区在线| 亚洲韩国精品一区| 91视频观看免费| 中文字幕中文字幕在线一区| 国产一区二区三区四区五区美女| 欧美一区二区女人| 亚洲成a人在线观看| 91色视频在线| 国产精品理伦片| 国产精品 日产精品 欧美精品| 制服丝袜成人动漫| 亚洲丶国产丶欧美一区二区三区| 色综合视频在线观看| 国产精品美女久久久久久久久久久| 精品在线一区二区| 日韩视频免费观看高清完整版 | 日韩激情一二三区| 欧美日韩亚洲综合一区二区三区| 亚洲人吸女人奶水| 色综合久久88色综合天天免费| 国产精品毛片高清在线完整版| 国产不卡免费视频| 国产精品五月天| 不卡高清视频专区| 国产精品国产自产拍在线| 成人午夜精品在线| 国产精品福利一区| 91亚洲精品久久久蜜桃网站| 国产精品沙发午睡系列990531| 国产精品18久久久| 中文一区在线播放| av在线一区二区三区| 国产精品久久久久毛片软件| 成人高清av在线| 亚洲免费观看视频| 欧美在线影院一区二区| 午夜影视日本亚洲欧洲精品| 欧美日韩精品一区二区三区蜜桃| 午夜欧美在线一二页| 91精品在线免费观看| 老司机免费视频一区二区| 精品久久久久久久久久久院品网| 韩国成人精品a∨在线观看| 久久精品视频在线看| 成人动漫精品一区二区| 亚洲精品国产一区二区精华液 | 亚洲欧美乱综合| 欧美亚洲综合色| 麻豆精品久久精品色综合| 日韩欧美中文一区二区| 国内一区二区在线| 中文字幕av免费专区久久| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美久久久久免费| 免费高清视频精品| 国产三级精品三级在线专区| 99re66热这里只有精品3直播| 亚洲三级免费观看| 91精品久久久久久久91蜜桃| 国产一区二区三区在线观看免费 | 成人做爰69片免费看网站| 亚洲欧洲日本在线| 精品视频一区二区三区免费| 久久精品二区亚洲w码| 欧美—级在线免费片| 在线视频亚洲一区| 韩国成人精品a∨在线观看| 国产精品初高中害羞小美女文 | 亚洲资源在线观看| 日韩欧美精品在线| 欧美日韩成人在线一区| 麻豆传媒一区二区三区| 国产精品久久久久久久久久免费看| 欧美色图激情小说| 国产激情偷乱视频一区二区三区| 亚洲视频电影在线| 日韩精品在线网站| 色综合天天视频在线观看| 黄网站免费久久| 亚洲一区免费观看| 欧美韩日一区二区三区四区| 欧美日韩美少妇| www.成人网.com| 久久精品99国产国产精| 亚洲欧美日韩电影| 欧美精品一区在线观看| 欧洲一区二区av| 丁香激情综合国产| 蜜桃av噜噜一区二区三区小说| 亚洲欧洲日韩综合一区二区| 欧美电影免费观看高清完整版在 | 亚洲色图欧洲色图| 日韩一区二区电影在线| 91女神在线视频| 国产在线精品一区二区不卡了| 午夜日韩在线观看| 91在线你懂得| 国产精品一区二区三区99| 日本亚洲天堂网| 亚洲国产精品尤物yw在线观看| 国产精品视频免费看| 精品88久久久久88久久久| 欧美日韩精品一区二区三区四区 | 美女尤物国产一区| 亚洲制服丝袜一区| 亚洲视频在线一区| 日本一区二区三区电影| 精品成人佐山爱一区二区| 欧美日产国产精品| 欧美色图天堂网| 欧美中文字幕一区| 91视频在线看| 99国产精品久久久久| 国内成人免费视频| 久久99国产精品免费| 丝袜美腿成人在线| 亚洲h动漫在线| 亚洲一区二区三区自拍| 综合久久久久久| 亚洲欧洲另类国产综合| 中文字幕一区二区三区在线播放 | 国产福利精品一区| 国产成都精品91一区二区三| 精品一区二区三区影院在线午夜|