深入理解计算机系统第2.6题

求整数3510593的内存二进制表示和浮点数3510593.0的内存二进制表示有多少位数时匹配的?

#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
using namespace std;

//find_largest_substring用来查找str1和str2中最大的连续子串
//如果找到返回true,并将子串存储在substr中,并返回子串在str1中开始的下标index_in_str1。否则返回false

bool find_largest_substring(const string& str1, const string& str2, string& substr, int& index_in_str1, int& index_in_str2)
{
	if(str1.empty() || str2.empty())
		return false;
	size_t len1 = str1.size();
	size_t len2 = str2.size();
	
	vector<vector<int> > vec(len1 + 1, vector<int>(len2 + 1, 0));
	for(size_t row = 1; row != len1 + 1; row++) {
		for(size_t col = 1; col != len2 + 1; col++) {
			if(str1[row - 1] == str2[col - 1]) {
				vec[row][col] = vec[row - 1][col - 1] + 1;
			}
			else { //str1[row - 1] != str2[col - 1]
				vec[row][col] = 0;
			}
		}
	}

	int max = 0;
	int x = 0, y = 0;
	//找出长度最长的值
	for(size_t row = 1; row != len1 + 1; row++) {
		for(size_t col = 1; col != len2 + 1; col++) {
			if(vec[row][col] > max) {
				max = vec[row][col];
				x = row;
				y = col;
			}
		}
	}
	
	string ss(str1, x - max,max);
	index_in_str1 = x - max;
	index_in_str2 = y - max;
	substr = ss;
	return true;
}

//逆置字符串
void reverse_string(string& str)
{
	if(str.empty())
		return;
	for(size_t i = 0, j = str.size() - 1; i < j; i++, j--) {
		char c = str[i];
		str[i] = str[j];
		str[j] = c;
	}
	return;
}

int main(void){
	int x = 3510593;
	int* pi = &x;
	float f = static_cast<float>(x);

	//char* pc = reinterpret_cast<char*>(pi);
	unsigned char* pc = reinterpret_cast<unsigned char*>(pi);
	cout << "整数3510593的十六进制(小端法):"<< endl;
	for(int i = 0; i < sizeof(x); i++) {
		printf("%.2x", *pc);
		pc++;
		cout << endl;
	}

	float* pf = &f;
	//pc = reinterpret_cast<char *>(pf);
	pc = reinterpret_cast<unsigned char *>(pf);
	cout << "浮点数3510593.0的十六进制(小端法):" << endl;
	for(int i = 0; i < sizeof(f); i++) {
		printf("%.2x", *(pc + i));
		cout << endl;
	}
	/*
	整数3510593的十六进制(小端法):
	41
	ffffff91                       //这里的输出结果多出这么多f是因为我们是这么写的char* pc = reinterpret_cast<char*>(pi);
	35							   //printf在解释0x91的时候就解释为有符号的整数,高位为1,所以前面加了很多f,
	00                             //改为unsigned char*类型指针以后,输出正常了
	浮点数3510593.0的十六进制(小端法):
	04
	45
	56
	4a
	请按任意键继续. . .
	*/

	string str1, str2;//str1,str2分别用来表示x的二进制表示和y的二进制表示
	for(int i = 0; i < sizeof(int) * 8; i++) {
		if((x & (0x1 << i)) != 0)
			str1 = str1 + '1';
		else
			str1 = str1 + '0';
	}
	int* temp_pointer = reinterpret_cast<int*>(pf);
	for(int i = 0; i < sizeof(int) * 8; i++) {
		if(((*temp_pointer) & (0x1 << i)) != 0)
			str2 = str2 + '1';
		else
			str2 = str2 + '0';
	}

	reverse_string(str1);
	reverse_string(str2);
	string substr;
	int index_in_str1;
	int index_in_str2;
	bool result = find_largest_substring(str1, str2, substr, index_in_str1, index_in_str2);
	if(result) {
		cout << endl << "整数3510593在内存中的二进制表示str1 :" << str1 << endl 
			<< "浮点数3510593.0在内存中的二进制表示str2 :" << str2 << endl << endl << "最长公共连续子串:" << endl ;
		cout << substr << "         长度为 :" << substr.size() << endl;
		cout << "最长公共连续子串在str1中开始的下标:" << index_in_str1 << endl
			<<"最长公共连续子串在str1中开始的下标:" << index_in_str2 << endl;
	}
	return 0;
}

/*
最后的运行结果:
整数3510593的十六进制(小端法):
41
91
35
00
浮点数3510593.0的十六进制(小端法):
04
45
56
4a

整数3510593在内存中的二进制表示str1 :00000000001101011001000101000001
浮点数3510593.0在内存中的二进制表示str2 :01001010010101100100010100000100

最长公共连续子串:
101011001000101000001         长度为 :21
最长公共连续子串在str1中开始的下标:11
最长公共连续子串在str1中开始的下标:9
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值