求整数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
*/