需求:将一个无符号整型的数按8位进行一划分,转换为(192.168.1.1)这种IP地址形式。
方法一:常规方法
图解原理:转换为2进制,从右向左8位一划分,不足的部分用0填充。
![](https://img-blog.csdnimg.cn/img_convert/3c1b31b2e39fc925eee758eb82494d83.png)
函数设计:图示
![](https://img-blog.csdnimg.cn/img_convert/2fb953b6442a0d3377f9e65f60579cdf.png)
核心:用四个变量分别记录没每8位二进制对应的十进制数
代码实现:
#include <stdio.h>
#include <string.h> //strlen函数
#include <stdlib.h> //itoa函数
#include <math.h> //pow函数
void ipdress(unsigned int ip,char buff[])
{
char arr[35];
itoa(ip,arr,2);
int len = strlen(arr)-1;
int a=0,b=0,c=0,d=0;
for(int i=0,j=0;j<32;i++,j++,len--)
{
if(i==8) i=0; //次方控制变量
if(len>=0 && arr[len] != '0'){
if(j<8) d+=pow(2,i);
else if(j>=8 && j<16) c+=pow(2,i);
else if(j>=16 && j<24)b+=pow(2,i);
else if(j>=24 && j<32) a+=pow(2,i);
}
}
sprintf_s(buff,16,"%d.%d.%d.%d\0",a,b,c,d);//格式转换
}
int main()
{
unsigned int ip=123456789;
char buff[16];
//scanf("%u",&ip);
ipdress(ip,buff);
printf("%s\n",buff);
return 0;
}
该代码的时间复杂度为: O(n)
用例 测试:
![](https://img-blog.csdnimg.cn/img_convert/e5bd9e0be07dfe39d40983ff23aa4c56.png)
方法二:利用联合体结构(共享内存),结构体结构嵌套(字节对齐),将四个字节分为4份
ip地址每个字段为0~255,故使用无符号字符类型。
注意windows为小端存储模式。证明在此lian'jielianjie文末http://t.csdn.cn/gthdm
#include <stdio.h>
union ip
{
unsigned int a;
struct {
unsigned char s1;
unsigned char s2;
unsigned char s3;
unsigned char s4;
};
};
void Toip(unsigned int a, char* buff)
{
ip b ;
b.a = a;
int ch=b.s1;
sprintf_s(buff, 16, "%d.%d.%d.%d\0", b.s4, b.s3, b.s2, b.s1);//格式转换
//widows平台为小端模式,低地址存放低位数据
}
int main()
{
unsigned int ip = 123456789;
char buff[16];
//scanf("%u",&ip);
Toip(ip, buff);
printf("%s", buff);
return 0;
}