当前位置: 首页 > news >正文

【北邮-本科-通信原理】第五章关于HDB3编码的C++实现

目录

一、HDB3码简介

二、实现思路

(1)当data【i】= 0时

(2)当data【i】=1时

(3)审计变量

三、代码部分

3.1、审计变量

3.2、data[ i ] == 0

3.2、data[ i ] == 1

3.3、更新flag

3.4、整体代码

3.5、运行结果

3.6、更多测试

四、错误日志

4.1、int8_t不能作为整型数据类型


一、HDB3码简介

HDB3(High Density Bipolar of code 3)码的全称是三阶高密度双极性码。

编码规则:

(a)将0编为0,将1交替编为±1;

(b)遇到连续四个零,将第四个零编为V,符号与前一个V相反;

(c)如果该V与前一个非零值符号不同,将第一个零编为B,符号与该V相同;

(d)将该V之后的1继续交替编为±1;

(e)重复以上步骤,最终将B和V都改为1,采用归零码成型。

bn

1000001100000000101
dn1+1000+V0-1+1-B00-V+B00+V-10+1
dn2+1-B00-V0+1-1+B00+V-B00-V+10-1
dn3-1+B00+V0-1+1-B00-V+B00+V-10+1
dn4-1000-V0+1-1+B00+V-B00-V+10-1

二、实现思路

现以第一个“1”编为“+1”,第一个“V”编为“+V”为例讲解:

    记 +V  == +2记 +B  == +3记第一个1标为+1记第一个V标为+V

任取一个待编码的数,非0即1,故分0、1两种情况讨论。

(1)当data【i】= 0时

其后三项都是0,那么这四项就组成了“连零4序列”,本项是该序列的序列头。那么data【i+3】就应该被编为“V”,本“V”正负号与上一个“V”的正负号相反;同时,若本“V”与上一非零值符号不同,则data【i】应标为“B”,符号与本“V”相同;

否则,0照抄。

(2)当data【i】=1时

如果这是第一个“1”:如果前面没有“V”,那编为“+1”;如果前面有“V”,那编为与“V”极性相反的极性;

否则,所有的“1”的正负号应与上一个非零元素的极性相反

(3)审计变量

故,需要有bool变量记录:循环执行一步后【非零值的正负】和【V的正负】。

三、代码部分

3.1、审计变量

bool exist_1 = 0;            //待编码是否出现过“1”
bool exist_V = 0;            //已编码是否出现过“±V”
bool flag = 0;		         //前一个非零值的符号
bool flag_for_V = (!first_V);//当前V的符号

3.2、data[ i ] == 0

对二、(1)的实现:

if (data[i] == 0)
{if ((i <= data.size() - 3) && (data[i + 1] == 0)&& (data[i + 2] == 0) && (data[i + 3] == 0)){data[i + 3] = (flag_for_V == 0) ? +2 : -2;//如果上一项的V是负的,则这项的V编为正的;//如果上一项的V是正的,则这项的V编为负的。flag_for_V = (!flag_for_V); //修改flag_for_V,记录当前的V的正负if (flag_for_V != flag)     //如果flag_for_V和上一个非零值极性不同data[i] = (flag_for_V == 1) ? +3 : -3;//则本项应即为±B,正负和当前V的正负相同}
}

3.2、data[ i ] == 1

对二、(2)的实现:

else if (data[i] == 1)
{if (exist_1 == 0)    //如果这是第一个“1”{exist_1 = 1;     //记录一下,现在已经有第一个“1”了if (exist_V == 0)flag = first_1;//如果前面除了“0”和“±V”(“±B”)之外什么都没有,那flag赋值为用户输入的规定else flag = (!flag_for_V);//否则,即前面可能有“±V”(“±B”),//那么flag赋值为上一个非零元素(即“V”)相反的极性。data[i] = (flag == 1) ? 1 : -1;//本“1”的极性,取决于flag的极性。}else data[i] = (flag == 1) ? -1 : 1;//如果已经存在过“1”了而又碰到“1”,那么“1”的极性与上一个非零元素极性相反。
}

也可以写做:

		else if (data[i] == 1){if (exist_1 == 0 && exist_V == 0){exist_1 = 1;flag = first_1;data[i] = (flag == 1) ? 1 : -1;}else data[i] = (flag == 1) ? -1 : 1;}

3.3、更新flag

if (data[i] != 0)flag = (data[i] > 0) ? 1 : 0;

如果当前data【i】非零(即“±B”、“±V”、“±1”),那么如果data【i】>0,flag记为1,否则记为0。

3.4、整体代码

#include <iostream>
#include <vector>
using namespace std;/*记 +V  == +2记 +B  == +3记第一个1标为+1记第一个V标为+V
*/void print_result(vector<int>data)
{for (int element:data){switch (element){case 2:cout << "+V" << " "; break;case -2:cout << "-V" << " "; break;case 3:cout << "+B" << " "; break;case -3:cout << "-B" << " "; break;default:cout << showpos << element << " "; break;}}cout << endl;
}void HDB3_handler(vector<int>data,bool first_1,bool first_V)
{bool exist_1 = 0;bool exist_V = 0;bool flag = 0;		//前一个非零值的符号bool flag_for_V = (!first_V);//V的符号for (int i = 0; i < data.size(); i++){if (data[i] == 0){if ((i <= data.size() - 3) && (data[i + 1] == 0)&& (data[i + 2] == 0) && (data[i + 3] == 0)){exist_V = 1;data[i + 3] = (flag_for_V == 0) ? +2 : -2;flag_for_V = (!flag_for_V);if (flag_for_V != flag)data[i] = (flag_for_V == 1) ? +3 : -3;}}else if (data[i] == 1){if (exist_1 == 0){exist_1 = 1;if (exist_V == 0)flag = first_1;else flag = (!flag_for_V);data[i] = (flag == 1) ? 1 : -1;}else data[i] = (flag == 1) ? -1 : 1;}//else if (data[i] == 1)//{//	if (exist_1 == 0 && exist_V == 0)//	{//		exist_1 = 1;//		flag = first_1;//		data[i] = (flag == 1) ? 1 : -1;//	}//	else data[i] = (flag == 1) ? -1 : 1;//}if (data[i] != 0)flag = (data[i] > 0) ? 1 : 0;}print_result(data);
}int main()
{system("color 0A");vector<int>data = { 1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,1 };print_result(data);HDB3_handler(data,true,true);HDB3_handler(data, true, false);HDB3_handler(data, false, true);HDB3_handler(data, false, false);return 0;
}

3.5、运行结果

3.6、更多测试

int main()
{system("color 0A");vector<int>data = { 1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,1 };vector<int>data_1 = { 1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0 };print_result(data_1); HDB3_handler(data_1, true, true);HDB3_handler(data_1, true, false);//HDB3_handler(data,true,true);//HDB3_handler(data, true, false);//HDB3_handler(data, false, true);//HDB3_handler(data, false, false);return 0;
}

四、错误日志

4.1、int8_t不能作为整型数据类型

void print_result_2(vector<int8_t>data)
{for (auto it = data.begin(); it != data.end(); ++it)std::cout << *it << " ";
}

这段代码不能够打印出来vector,原因是:

所以不能为了更节省内存空间而将vector<int>写成vector<int8_t>。

http://www.dtcms.com/a/492414.html

相关文章:

  • 酒类网站建设方案案酷玛网站建设
  • 晋江网站建设联系电话销售渠道都有哪些
  • 商务网站建设策划书2000字做汽车团购的网站有哪些
  • 网站的域名空间思茅网站建设
  • 定西市网站建设企业wordpress网站缩
  • 黑河做网站公司wordpress标签管理系统
  • RunnableParallel
  • 做网站要学什么c语言如何在手机上运行wordpress
  • 建设农产品网站总结ppt三明市建设局网站
  • 好的网站建设哪家好随州网站建设价格
  • 可信验证网站深圳高端网站设计公司
  • 深入理解 Rust 的类型系统:内存布局、Trait 与类型推理
  • how to Disable SMPL(Sudden Momentary Power Loss) feature
  • 性能测试实战:JMeter全攻略
  • 淘宝客网站建设视频教程制作企业网站的
  • Furtherance,一个隐私友好的时间追踪工具
  • 网站开发和设计人员的岗位要求个人网站做论坛
  • 网站开发工程师基础centos7更新Wordpress
  • 网站建设要托管服务器百度大全下载
  • 刷链接浏览量网站建筑工程 网络图
  • 玉环做网站找那家公司网站备案账号是什么样的
  • Redis 如何设置密码及验证密码?
  • HTTPS 的加密流程
  • 有什么知名网站是用织梦做的响应式网站制作价格
  • 企业营销型网站的内容wordpress停用react
  • 网站为什么要续费seo是什么意思的缩写
  • C++二叉搜索树,AVL树与红黑树
  • 阿里云ACK多个Service绑定单个SLB实践
  • 电脑硬盘和内存查询和分配
  • 公众电影网站怎么做保洁公司在哪个网站做推广比较好