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

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

?? arith.cpp

?? 非常好用的五子棋游戲源碼
?? CPP
字號:
// Created:10-30-98
// By Jeff Connelly

// Arithmetic encoding

#include "stdafx.h"
#include <stdio.h>
#define EXPORTING
#include "comprlib.h"

#define MAXIMUM_SCALE   16383   // Maximum allowed frequency count
#define ESCAPE            256   // Escape symbol
#define DONE               -1   // Output stream empty smymbol
#define FLUSH              -2   // Symbol to flush model

// A symbol can be represented as an 'int', or a pair of counts on a scale.
typedef struct
{
    unsigned short low_count;
    unsigned short high_count;
    unsigned short scale;
} SYMBOL;

// Prototypes
static void initialize_arithmetic_decoder();
static void remove_symbol_from_stream(SYMBOL* s);
static void initialize_arithmetic_encoder();
static void encode_symbol(SYMBOL* s);
static void flush_arithmetic_encoder();
static short get_current_count(SYMBOL* s);

// Bit I/O
static short input_bit();
static void initialize_output_bitstream();
static void output_bit(int bit);
static void flush_output_bitstream();
static void initialize_input_bitstream();
static long bit_ftell_output();
static long bit_ftell_input();

#define BUFFER_SIZE   0x100
static char buffer[BUFFER_SIZE + 2];        // I/O buffer
static char* current_byte;                  // Pointer to current byte
static int output_mask;                     // Mask applied to output byte
static int input_bytes_left;                // Variables that keep track of
static int input_bits_left;                 // the input state and end-of-
static int past_eof;                        // file (actually stream) status.

static void initialize_output_bitstream()
{
    current_byte = buffer;
    *current_byte = 0;
    output_mask = 0x80;
}

static void output_bit(int bit)
{
    register int i = 0;

    if (bit)
        *current_byte |= output_mask;
    output_mask >>= 1;
    if (!output_mask)
    {
        output_mask = 0x80;
        ++current_byte;
        if (current_byte == (buffer + BUFFER_SIZE))
        {
            for (i = 0; i < BUFFER_SIZE; ++i)
            {
                write_byte(*(buffer + i));
            }
            current_byte = buffer;
        }
        *current_byte = 0;
    }
}

static void flush_output_bitstream()
{
    register int i;
    for (i = 0; i < (current_byte - buffer) + 1; ++i)
    {
        write_byte(*(buffer + i));
    }
    current_byte = buffer;
}

static void initialize_input_bitstream()
{
    input_bits_left = 0;
    input_bytes_left = 1;
    past_eof = 0;
}

static short input_bit()
{
    register int i = 0;

    if (!input_bits_left)
    {
        ++current_byte;
        --input_bytes_left;
        input_bits_left = 8;
        if (!input_bytes_left)
        {
            input_bytes_left = 0;
            for (input_bytes_left = 0; input_bytes_left < BUFFER_SIZE &&
                 !end_of_data(); ++i)
            {
                buffer[i] = read_byte();
            }
            if (!input_bytes_left)
            {
                if (past_eof)
                {
                    EXCEPTION(ERR_NOTCOMPR, "Bad input file", "input_bit()");
                } else {
                    past_eof = 1;
                    input_bytes_left = 2;
                }
            }
            current_byte = buffer;
        }
    }
    --input_bits_left;
    return ((*current_byte >> input_bits_left) & 1);
}

// State of encoder/decoder
static unsigned short int code;     // Present input code value
static unsigned short int low;      // Start of current code range
static unsigned short int high;     // End of current code range
static long underflow_bits;         // Number of underflow bits pending

// Initialize encoding process
static void initialize_arithmetic_encoder()
{
    low = 0;
    high = 0xFFFF;
    underflow_bits = 0;
}

// Encodes a symbol
static void encode_symbol(SYMBOL* s)
{
    long range;

    // The tree lines below rescale high and low for the new symbol
    range = (long)(high - low) + 1;
    high = low + (unsigned short)
                 ((range * s->high_count) / s->scale - 1);
    low = low + (unsigned short)
                ((range * s->low_count) / s->scale);

    // This loop turns out news bits until high and low are far enough to be
    // stable.
    while (true)
    {
        // If this test pasts, it means most-significant-digits match, and
        // can be sent to the output stream
        if ((high & 0x8000) == (low & 0x8000))
        {
            output_bit(high & 0x8000);
            while (underflow_bits > 0)
            {
                output_bit(~high & 0x8000);
                --underflow_bits;
            }
        } else if ((low & 0x4000) && !(high & 0x4000)) {
            // The numbers are in danger of underflow because the most
            // significant digits do not mast, and because the second digits
            // are just one apart.
            underflow_bits += 1;
            low &= 0x3FFFF;
            high |= 0x4000;
        } else
            return;
        low <<= 1;
        high <<= 1;
        high |= 1;
    }
}

// At the end of encoding, there are still significant bits left in the
// high and low variables, we output two bits, plus as many underflow bits
// as needed.
static void flush_arithmetic_encoder()
{
    output_bit(low & 0x4000);
    ++underflow_bits;
    while (underflow_bits-- > 0)
        output_bit(~low & 0x4000);
}

// Called to figure out which symbol is waiting to be decoded.  Model scale
// is in 's->scale', and returns count that corresponds to the floating
// point code 'code = count / s->scale'
static short get_current_count(SYMBOL* s)
{
    long range;
    short count;

    range = (long)(high - low) + 1;
    count = (short)
            ((((long)(code - low) + 1) * s->scale - 1) / range);

    return count;
}

static void initialize_arithmetic_decoder()
{
    int i;

    code = 0;

    for (i = 0; i < 0x10; ++i)
    {
        code <<= 1;
        code += input_bit();
    }
    low = 0;
    high = 0xFFFF;
}

// After the character has been decoded, this function should be called to
// remove it
static void remove_symbol_from_stream(SYMBOL* s)
{
    long range;

    // First the range is expanded to account for symbol removal
    range = (long(high - low) + 1);
    high = low + (unsigned short)
                 ((range * s->high_count) / s->scale - 1);
    low = low + (unsigned short)
                ((range * s->low_count) / s->scale);

    // Ship out any possible bits
    while (true)
    {
        if ((high & 0x8000) == (low & 0x8000))
        {
        } else if ((low & 0x4000) == 0x4000 && (high & 0x4000) == 0) {
            code ^= 0x4000;
            low &= 0x3FFF;
            high |= 0x4000;
        } else
            return;     // Nothing can be shifted out

        low <<= 1;
        high <<= 1;
        high |= 1;
        code <<= 1;
        code += input_bit();
    }
}

// Probabilities of characters
static struct
{
    char c;
    unsigned short low;
    unsigned short high;
} probabilities[] = { 0, 0, 0 };

// Builds the probability table from the input stream
static void build_probability_table()
{
    register char c;
    register short high = 1, low = 0, i = 0;
    long freq[0x100] = { 0, 0 };       // Frequency table

    // Build the frequency table 'freq' that contains frequencys of chars
    beginning_of_data();
    while (!end_of_data())
    {
        c = read_byte();
        ++freq[c];
    }

    beginning_of_data();

    // Now build it
    for (i = 0; i < 0x100; ++i)
    {
        high += (short)freq[i];
        low += (short)freq[i];
        probabilities[i].high = high;
        probabilities[i].low = low;
    }
}

// Converts a character to a SYMBOL type.
static void convert_int_to_symbol (char c, SYMBOL* s)
{
    register int i = 0;

    while (true)
    {
        if (c == probabilities[i].c)
        {
            s->low_count = probabilities[i].low;
            s->high_count = probabilities[i].high;
            s->scale = (unsigned short)stream_size();
            return;
        }
        ++i;
    }
}

static char convert_symbol_to_int (unsigned int count, SYMBOL* s)
{
    register int i = 0;

    while (true)
    {
        if (count >= probabilities[i].low &&
            count < probabilities[i].high)
        {
            s->low_count = probabilities[i].low;
            s->high_count = probabilities[i].high;
            s->scale = (unsigned short)stream_size();
            return probabilities[i].c;
        }
        ++i;
    }
}

// Compress using arithmetic compression
void EXPORT arithmetic_encode()
{
    register char c;
    SYMBOL s;

    initialize_output_bitstream();
    initialize_arithmetic_encoder();

    build_probability_table();

    while (!end_of_data())
    {
        c = read_byte();
        convert_int_to_symbol (c, &s);
        encode_symbol (&s);
    }
    flush_arithmetic_encoder();
    flush_output_bitstream();
}

void EXPORT arithmetic_decode()
{
    SYMBOL s;
    register char c;
    int count;
    initialize_input_bitstream();
    initialize_arithmetic_decoder();
    while (true)
    {
        s.scale = (unsigned short)stream_size();
        count = get_current_count (&s);
        c = convert_symbol_to_int(count, &s);
        if (end_of_data())
            break;
        remove_symbol_from_stream(&s);
        write_byte(c);
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产伦理网| 老司机免费视频一区二区| 日韩av网站免费在线| 国产精品一区在线观看你懂的| 色菇凉天天综合网| 精品久久久久一区| 性做久久久久久免费观看欧美| av在线不卡网| 欧美激情一区不卡| 麻豆精品新av中文字幕| 欧美日韩国产首页| 一区二区欧美视频| 成人aaaa免费全部观看| 久久新电视剧免费观看| 奇米精品一区二区三区在线观看 | 成人午夜av电影| 欧美一区二区大片| 亚瑟在线精品视频| 欧美午夜一区二区| 樱花影视一区二区| 91麻豆免费在线观看| 中文字幕不卡一区| 成人黄色小视频在线观看| 26uuu成人网一区二区三区| 久久精品99久久久| 日韩欧美三级在线| 激情综合一区二区三区| 精品国产第一区二区三区观看体验| 美女国产一区二区| 精品久久久久久久久久久久久久久久久| 日韩成人一区二区三区在线观看| 欧美三级视频在线播放| 偷窥少妇高潮呻吟av久久免费| 欧美日韩视频在线第一区| 亚洲不卡在线观看| 在线不卡a资源高清| 日韩av一区二| 日韩精品在线看片z| 国产另类ts人妖一区二区| 久久久午夜精品| 成人午夜短视频| 亚洲三级电影全部在线观看高清| 在线亚洲免费视频| 午夜精品免费在线| 欧美成人精品高清在线播放 | 91在线高清观看| 亚洲日本护士毛茸茸| 欧美色男人天堂| 欧美aa在线视频| 久久精品视频免费观看| 91在线你懂得| 首页国产丝袜综合| 久久免费午夜影院| 99在线视频精品| 天堂av在线一区| 久久久久97国产精华液好用吗| 成人深夜在线观看| 亚洲综合清纯丝袜自拍| 日韩欧美高清在线| 91亚洲精品久久久蜜桃网站| 亚洲6080在线| 中文字幕欧美激情| 欧美影视一区在线| 国产精品白丝jk白祙喷水网站 | 91美女在线观看| 日韩av在线免费观看不卡| 欧美国产禁国产网站cc| 欧美日韩一区 二区 三区 久久精品| 麻豆91在线播放免费| 亚洲色图.com| 久久久久久久久久美女| 在线免费观看日本欧美| 国产资源精品在线观看| 亚洲精品视频在线| 久久久亚洲欧洲日产国码αv| 91啪亚洲精品| 美美哒免费高清在线观看视频一区二区 | 国产一区二区毛片| 一区二区三区四区高清精品免费观看 | 亚洲天堂av老司机| 精品欧美一区二区三区精品久久| 91捆绑美女网站| 国产一区二区影院| 午夜电影久久久| 亚洲精品自拍动漫在线| 国产片一区二区| 亚洲精品一区二区三区99| 欧美日韩午夜影院| 91麻豆国产自产在线观看| 国内精品久久久久影院色| 亚洲一区二区三区美女| 中文字幕在线不卡视频| 2欧美一区二区三区在线观看视频| 欧美天堂亚洲电影院在线播放| 成人动漫精品一区二区| 国产精品自拍三区| 久久国产精品色婷婷| 天堂久久久久va久久久久| 亚洲综合激情另类小说区| 亚洲图片你懂的| 国产精品传媒视频| 国产精品欧美久久久久一区二区| 久久久久久久久久美女| 久久综合给合久久狠狠狠97色69| 欧美一区二区久久| 在线电影院国产精品| 欧美日韩视频在线观看一区二区三区 | 久久精品一区二区三区四区| 日韩欧美国产午夜精品| 7777精品伊人久久久大香线蕉超级流畅 | 国产精品99久久久久久久vr| 久久国产综合精品| 奇米亚洲午夜久久精品| 日本亚洲一区二区| 久久国产人妖系列| 国产美女娇喘av呻吟久久| 黑人巨大精品欧美一区| 国产精品亚洲视频| 播五月开心婷婷综合| 97se亚洲国产综合自在线| 91蜜桃视频在线| 欧美草草影院在线视频| 欧美一区二区三区成人| 2022国产精品视频| 亚洲欧洲在线观看av| 亚洲美女屁股眼交3| 亚洲妇女屁股眼交7| 日韩av在线播放中文字幕| 久久er99热精品一区二区| 精品综合久久久久久8888| 在线观看91av| 91福利社在线观看| 欧美另类久久久品| 精品欧美久久久| 国产精品毛片高清在线完整版| 亚洲男人的天堂在线aⅴ视频| 一级中文字幕一区二区| 欧美a一区二区| 大陆成人av片| 在线观看日韩av先锋影音电影院| 欧美日本精品一区二区三区| 欧美成人猛片aaaaaaa| 中文字幕一区二区三区精华液| 亚洲一区自拍偷拍| 狠狠网亚洲精品| 日本高清免费不卡视频| 精品国产一二三| 亚洲色图丝袜美腿| 久久精品国产亚洲一区二区三区 | 欧美va亚洲va在线观看蝴蝶网| 亚洲国产成人一区二区三区| 亚州成人在线电影| 成人在线视频一区二区| 3d动漫精品啪啪一区二区竹菊| 久久久久久久精| 亚洲国产美国国产综合一区二区| 国产一区二区按摩在线观看| 欧美日韩在线电影| 欧美国产欧美综合| 奇米精品一区二区三区四区| 99在线精品免费| 26uuu亚洲综合色欧美| 性欧美大战久久久久久久久| 成人激情午夜影院| 精品国产一区二区三区四区四| 亚洲制服欧美中文字幕中文字幕| 国产成人精品免费在线| 91精品国产全国免费观看| 亚洲三级视频在线观看| 国产精品一二三| 日韩一区二区免费电影| 亚洲成人免费av| 色噜噜狠狠一区二区三区果冻| 久久久久高清精品| 麻豆精品一二三| 69堂国产成人免费视频| 一区二区成人在线| 97精品久久久久中文字幕| 国产午夜一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 777精品伊人久久久久大香线蕉| 亚洲精品国产品国语在线app| av亚洲产国偷v产偷v自拍| 久久先锋资源网| 国产一区二区在线看| 久久中文字幕电影| 国产在线国偷精品免费看| 日韩网站在线看片你懂的| 亚洲福利视频一区| 欧美性生活久久| 亚洲在线免费播放| 欧美在线视频你懂得| 一卡二卡三卡日韩欧美| 日本电影亚洲天堂一区| 亚洲乱码国产乱码精品精可以看| 99热99精品| 一区二区三区在线影院| 日本高清免费不卡视频| 亚洲午夜私人影院| 欧美久久免费观看|