描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
本题含有多组输入用例,每组用例需要你将一个ip地址转换为整数、将一个整数转换为ip地址。
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1
输入:
10.0.3.193
167969729
复制
输出:
167773121
10.3.3.193
#include <bits/stdc++.h>
using namespace std;
long Getvalue(vector<int>& dq)
{
vector<int> tmp(32);
int index =3;
for (auto& num:dq)
{
for (int i=0;i<8;i++)
{
if (num & (1<<i))
{
tmp[index*8+i] = 1;
}
else{
tmp[index*8+i] = 0;
}
}
index--;
}
long num = 0;
for (int i=0;i<32;i++)
{
num+=tmp[i]*pow(2,i);
}
return num;
}
string Getip(long a)
{
vector<int> tmp(32);
for (int i=31;i>=0;i--)
{
if (a&(1<<i))
{
tmp[i] = 1;
}
else{
tmp[i] = 0;
}
}
string s;
for (int i=31;i>=0;i-=8)
{
int j=i;
int num=0;
for (j;j>i-8;j--)
{
num+=tmp[j]*(1<<(7-i+j));
}
s+=to_string(num);
if (i>8) s+='.';
}
return s;
}
int main()
{
vector<int> dp;
string str;
long n;
vector<string> res;
while (cin>>str>>n)
{
int l=0;
string s;
for (int i=0;i<str.size();i++)
{
if (str[i]!='.') s+=str[i];
else
{
dp.push_back(stoi(s));
s.clear();
}
if (i == str.size()-1)
{
dp.push_back(stoi(s));
s.clear();
}
}
long ans = Getvalue(dp); string s1 = Getip(n);
dp.clear();
cout<<ans<<endl;cout<<s1<<endl;
}
return 0;
}