• 文章
  • 辅助进位与奇偶校验检测器
发布
2014年6月6日

辅助进位与奇偶校验检测器

评分:3.5/5 (51 票)
*****
此程序可用于检查两个数字相加时是否会产生辅助进位。这项任务可能很麻烦,因为像 C/C++ 这样的编程语言虽然在机器级别以二进制执行,但其在二进制级别的抽象以及在二进制级别对一个或多个变量进行操作以确定这些数字的属性是不可能的。

上述程序在用 C/C++ 等高级编程语言进行二进制级别操作的构思方面非常有用。此处还必须指出,此程序不兼容 C,但基本算法和实现技术可以保持不变。

这对于那些像我一样对嵌入式编程或嵌入式软件开发感兴趣的人最有帮助,但它仍然可以提供在二进制级别工作的思路/技术。我创建此程序是为了设计一个微控制器模拟器,该模拟器能够解释十六进制文件和汇编源代码,以在软件级别模拟硬件操作。

主源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

#include <iostream>
#include <bitset>
#include <string>
#include <sstream>
using namespace std;
bool AC;
bool P;
string dec2bin(int Decimal_Value){
	ostringstream os;
	os<<bitset<8>(Decimal_Value);
	return os.str();
}
void AC_Flag_Update(unsigned char a, unsigned char b){
	string s1 = dec2bin((int)a);
	string s2 = dec2bin((int)b);
	if ( s1.substr(4,1) == "1" && s2.substr(4,1) == "1" )
		AC = true ;
	else if ( s1.substr(4,1) == "0" && s2.substr(4,1) == "0" )
		AC = false;
	else
		AC_Flag_Update(a<<1 , b<<1);

}
void P_Flag_Update(unsigned char a){
	P = false;
	string s = dec2bin((int)a);
	for ( int i = 0; i < s.size(); i++ ){
		if( s.substr(i,1) == "1" )
			P =!P;
	}
}
int main()
{

	unsigned char c = 0x1a;
	unsigned char d = 0x06;
        AC_Flag_Update(c,d);
	P_Flag_Update(d);
	if(AC)
		cout<<"AC is present"<<endl;
	else
		cout<<"NO AC is present"<<endl;
	if(P)
		cout<<"P is SET"<<endl;
	else
		cout<<"P is CLEAR"<<endl;
}


以及 Makefile

1
2
3
4
5
6
7
8
9
10
11

TARGET= main
CC= g++ -std=c++11

all:
	$(CC) -Os -o $(TARGET) $(TARGET).cpp
run: $(TARGET)
	./$(TARGET)
clean:
	rm -f *~ $(TARGET)



AC is present
P is CLEAR