编码折线算法格式还提供了编码无符号值的步骤,如下:
下面说明了编码无符号值的步骤:
取初始无符号值:
174
将十进位值转换为二进制值:
10101110
将该二进制值分为 5 位一组的块(从右手边开始):
101 01110
将这些 5 位一组的块倒序放置:
01110 101
如果后面还有一个位块,则将每个值与 0x20 进行或操作 (OR):
101110 00101
将每个值转换为十进制值:
46 5
将每个值加上 63:
109 68
将每个值转换为其 ASCII 对应值:
mD
仔细看了一下,这部分的编码和有符号编码从第三步开始是一样的。于是调整自己的代码,如下:
#include "stdafx.h"
#include "string"
#include "iostream"
using namespace std;
//四舍五入取整函数
int interger(double x)
{
int y;
if(x<0)
y=int(x-0.5);
else if(x>=0)
y=int(x+0.5);
return y;
}
//无符号数编码
void encodeNumber(unsigned int sgn_num)
{
string result="";
//将该二进制值分为5位一组的块
while(sgn_num>=0x20)
{
int x;
x=sgn_num&0x1f;
// cout<<x<<endl;
//进行异或加上63
x=x|0x20;
// cout<<x<<" ";
x=x+63;
// cout<<x<<" ";
//change(x);
//cout<<char(x)<<endl;
result+=char(x);
sgn_num>>=5;
}
/*sgn_num=sgn_num&0x1f;
sgn_num=sgn_num|0x20;*/
// cout<<sgn_num<<" ";
result+=char(sgn_num+63);
cout<<result;
}
//有符号值编码
void encodeSignedNumber(int num)
{
int sgn_num;
//变换二进制值,左移,地位补0
sgn_num=num<<1;
// cout<<sgn_num<<endl;
if(num<0)
{
sgn_num=~(sgn_num);//对负数求反
}
encodeNumber(sgn_num);
}
int _tmain(int argc, _TCHAR* argv[])
{
//有符号数,设置成double型,双精度浮点型,10位有效数字,float是单精度浮点型,只有6位有效数字
double col=-179.9832104;
int num;
num=interger(col*100000);
encodeSignedNumber(num);
unsigned int x=174;
encodeNumber(x);
//system函数是用来执行一条dos命令或运行一个外部程序。 pause是暂停,并等待用户按键
system("pause");
return 0;
}