[编程题]整数与IP地址间的转换
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
每段可以看成是一个0-255的整数,需要对IP地址进行校验
输入描述:
输入 1 输入IP地址 2 输入10进制型的IP地址
输出描述:
输出 1 输出转换成10进制的IP地址 2 输出转换后的IP地址
输入例子:
10.0.3.193 167969729
输出例子:
167773121 10.3.3.193
解题思路
考察进制转换。
法1、以字符串形式存放二进制来进行处理
法2、通过位运算来完成进制转换
注意事项:
该十进制长整数用有符号整数存放会出错,需要使用无符号整数unsigned。
法1:
#include <iostream>
#include <math.h>
using namespace std;
/*十进制转二进制___指定位数*/
string DecimalToBinary( unsigned long n, string str ){
int k = str.length()-1;
while( n > 0 ){
str[k--] = n%2 + '0';
n /= 2;
}
return str;
}
/*二进制转十进制*/
unsigned long BinaryToDecimal( string str ){
unsigned long sum = 0;
for( int i = str.length()-1, k = 0; i >= 0; --i, ++k ){
sum += (str[i]-'0') * pow(2,k);
}
return sum;
}
int main()
{
int a[4];
unsigned long n;
char c;
while( cin>>a[0]>>c>>a[1]>>c>>a[2]>>c>>a[3] ){
cin>>n;
/*ip串转10进制数*/
string str;
for( int i = 0; i < 4; ++i ){
str += DecimalToBinary( a[i], "00000000" );
}
cout<<BinaryToDecimal( str )<<endl;
/*10进制数转ip串*/
string binarystr = DecimalToBinary( n, "00000000000000000000000000000000" );
string sstr[4] = {binarystr.substr(0,8), binarystr.substr(8,8), binarystr.substr(16,8), binarystr.substr(24)};
for( int i = 0; i < 3; ++i ){
cout<<BinaryToDecimal( sstr[i] )<<".";
}
cout<<BinaryToDecimal( sstr[3] )<<endl;
}
return 0;
}
法2:
#include <iostream>
using namespace std;
int main(){
unsigned a[4];//此处不使用unsigned会出错
unsigned long n;
char ch;
while( cin>>a[0]>>ch>>a[1]>>ch>>a[2]>>ch>>a[3] ){
cin>>n;
/*对二进制各字节左移后求并集*/
unsigned long sum = (a[0]<<24) | (a[1]<<16) | (a[2]<<8) | a[3] ;
cout<<sum<<endl;
/*提取长整数二进制各字节*/
a[0] = ( n & 0xff000000 ) >> 24;
a[1] = ( n & 0x00ff0000 ) >> 16;
a[2] = ( n & 0x0000ff00 ) >> 8;
a[3] = ( n & 0x000000ff ) ;
cout<<a[0]<<"."<<a[1]<<"."<<a[2]<<"."<<a[3]<<endl;
}
return 0;
}