算术编码.cpp

来自「比较简单的行程编码的小程序」· C++ 代码 · 共 114 行

CPP
114
字号
/*************************************************************
	多媒体作业-	算术编码程序

	编写人:杨润强  
	日期:2004.11.16
****************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 80
bool check(int *t,int f)//判断后面是否还有1
{
	int i;
	for(i=f;i<10;i++)
		if(t[i]==1)
			return true;
	return false;
}
void result(int *t,int *y,int f)//得到结果
{
	int i;
	for(i=0;i<=f;i++)
		t[i]=y[i];
}
void dtob(int *t,float flag)//十进制小数转换到二进制,并将小数部分存入一个数组
{
	int i;
	for(i=0;i<10;i++)
	{
		flag=flag*2;
		if(flag<1)
			t[i]=0;
		else
		{
			flag=flag-1;
			t[i]=1;
		}			
	}
}
void main()
{
	char s[MAX];
	int a[MAX];
	int b[MAX];
	int r[MAX]={0};
	register float zero,one,tempa=1.00000,tempb=0.00000,len;
	int i=0,j=0;
	printf("输入字符传:");
		gets(s);
	printf("输入0的概率:");
		scanf("%f",&zero);
	printf("输入1的概率:");
		scanf("%f",&one);

	for(i=0;i<int(strlen(s));i++)
	{
		if(s[i]!='0'&&s[i]!='1')
		{
			printf("串含有非0|1符号!\n");
			exit(0);
		}
		if(s[i]=='0')
		{	
			len=(tempa-tempb)*(1-zero);
			tempa=tempa-len;
		}
		else
		{
				len=(tempa-tempb)*one;
				tempb=tempb+len;
		}
	}
	dtob(a,tempa);
	dtob(b,tempb);
	for(i=0;i<10;i++)
	{
		if(a[i]==b[i])
			continue;
		else
			if(check(a,i))
			{
				result(r,a,i);
				break;
			}
			else
			{
				while(b[i]==1)
				{
					i++;
					break;
				}
				result(r,b,i);
			}
	}

	for(i=0;i<10;i++)
	{
		printf("%d",a[i]);
	}
	printf("\n");

	for(i=0;i<10;i++)
	{
		printf("%d",b[i]);
	}
	printf("\n");
	for(i=0;i<10;i++)
	{
		printf("%d",r[i]);
	}
	printf("\n");
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?