【C语言】A13率编码与解码

这是一个关于二进制编码与解码算法的实现示例。程序包括了三个主要部分:极性码(B1)、段落码(B2B3B4)和段内码(B5B6B7B8)。在编码过程中,根据输入数值生成对应的二进制字符串;在解码时,从二进制字符串中还原出原始数值。该算法涉及到了段长、段起始电平和段内量化阶等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编码: 

#include<bits/stdc++.h>
using namespace std;
#define N 8
int code[N] = {16,16,32,64,128,256,512,1024};//段落长度 
int jie[N] = {1,1,2,4,8,16,32,64};//段内量化阶 
int start[N] = {0,16,32,64,128,256,512,1024};//段起始电平 

void jixingma(char result[],int testNum)//B1
{
	 if(testNum > 0) result[0] = '1';
	 else result[0] = '0';
}

void duanluoma(char result[],int testNum)//B2B3B4 
{
	int low = 1,high = N,mid,p = 1;
	int num = abs(testNum);
	for(int i = 1 ; i <= 3; i++)
	{
		mid = (low+high+1)/2;//5
		if( num >= start[mid-1]){
			result[p++] = '1';
			low = mid;
		}
		else{
			result[p++] = '0';
			high = mid-1;
		}
	}
}

void duanneima(char result[],int testNum)//B5B6B7B8
{
	//先计算出起始电平,即算出 B2B3B4 的十进制数 
	int sum = 0;
	int low = 1,high = 16,mid;
	int num = abs(testNum);
	int p = 4;
	for(int i = 1 ; i <= 3;i++)
	{
		sum = sum*2+result[i]-'0';
	} 
	
	int s = start[sum];
	
	for(int i = 4;i <= 7;i++)
	{
		mid = (low+high)/2;
		
		if(s+jie[sum]*mid > num)
		{
			result[p++] = '0';
			high = mid;
		}
		else{
			result[p++] = '1';
			low = mid;
		}
	}
	result[p] = '\0';
} 

int main()
{
	char result[20];
	int testNum;
	scanf("%d",&testNum);
	jixingma(result,testNum);
	duanluoma(result,testNum);
	duanneima(result,testNum);
	printf("%s\n",result);
	return 0;
} 

解码:

#include<bits/stdc++.h>
using namespace std;
#define N 8
int code[N] = {16,16,32,64,128,256,512,1024};//段落长度 
int jie[N] = {1,1,2,4,8,16,32,64};//段内量化阶 
int start[N] = {0,16,32,64,128,256,512,1024};//段起始电平 

bool jixingma(char result[])//B1
{
	bool flag = true;
	if(result[0] == '0') flag = false;
	return flag;
}

int  duanluoma(int n)//B2B3B4 
{
	int testNum = start[n]; 
	return testNum;
}

int duanneima(char result[],int testNum,int n)//B5B6B7B8
{
	int sum = 0;
	for(int i = 4 ; i <= 7;i++)
	{
		sum = sum*2+result[i]-'0';
	} 
	testNum = testNum + jie[n]*sum;
	return testNum;
} 

int main()
{
	char result[20];
	int testNum=0;
	gets(result);//获取 
	int n = 0; 
	for(int i = 1 ; i <= 3;i++)
	{
		n = n*2+result[i]-'0';
	}//寻找段落码位置	
	testNum = duanluoma(n);
	testNum = duanneima(result,testNum,n);
	printf("未加0.5i\n");
	if(jixingma(result))	printf("%d\n",testNum);
	else printf("-%d\n",testNum);
	printf("加0.5i\n");
	if(jixingma(result))	printf("%.3f\n",testNum+0.5*jie[n]);
	else printf("-%.3f\n",testNum+0.5*jie[n]);	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂花香呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值