编码:
#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;
}