题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
http://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
**主要考验32位无符号数的操作
#include <stdio.h>
#include <string.h>
//10进制转2进制函数,a表示10进制数,b数组存储转换后的2进制数组,c表示数组最后一位下表+1
void trans10To2(unsigned int a,int *b,int c,int d){
int i=0;
for(i=c-1;i>=c-d;i--){
b[i]=a%2;
a=a/2;
}
}
//2进制转10进制函数,a为2进制数组,count返回转换后的10进制数
unsigned int trasn2To10(int *a,int b,int c){
unsigned int count=0;
int value=1;
int i=b;
for(i=i-1;i>=b-c;i--){
count=count+value*a[i];
value=value*2;
}
return count;
}
int main(){
int ip_1,ip_2,ip_3,ip_4=0;
unsigned int num=0;
unsigned int ip_num=0;
int num_ip1,num_ip2,num_ip3,num_ip4=0;
//输入IP
scanf("%d.%d.%d.%d",&ip_1,&ip_2,&ip_3,&ip_4);
scanf("%d",&num);
int ip[32]={0};
//IP转10进制
trans10To2(ip_1,ip,8,8);
trans10To2(ip_2,ip,16,8);
trans10To2(ip_3,ip,24,8);
trans10To2(ip_4,ip,32,8);
ip_num=trasn2To10(ip,32,32);
//10进制转IP
int num_ip[32]={0};
trans10To2(num, num_ip, 32, 32);
num_ip1=trasn2To10(num_ip, 8,8);
num_ip2=trasn2To10(num_ip, 16,8);
num_ip3=trasn2To10(num_ip, 24,8);
num_ip4=trasn2To10(num_ip, 32,8);
//输出
printf("%u\n",ip_num);
printf("%d.%d.%d.%d",num_ip1,num_ip2,num_ip3,num_ip4);
return 0;
}