方法一:计算掩码位数有两种方法,使用LOG或位运算都可以;使用LOG要注意向上取整和+3,而不是+2,+2计算不对,通不过。换底公式log a(b)=log c(b)/log c(a);C语言只有log以e为底,log10以10为底。
#include<iostream> #include<cmath> using namespace std; int GetNum(int x) { double y; y=log10(x+3)/log10(2); return (int)ceil(y); } int GetNum1(int x) //也可以用该函数 { int m=0,n=x+2; while(n) { m++; n=n>>1; } return m; } void g(int x,int& a,int& b,int& c,int& d) { char temp[32]; int i; for(i=31;i>31-GetNum(x);i--) temp[i]=0; for(;i>=0;i--) temp[i]=1; a=b=c=d=0; for(i=0;i<8;i++) a=a*2+temp[i]; for(;i<16;i++) b=b*2+temp[i]; for(;i<24;i++) c=c*2+temp[i]; for(;i<32;i++) d=d*2+temp[i]; } int main() { int a,b,c,d,x; while(cin>>x) { g(x,a,b,c,d); cout<<a<<"."<<b<<"."<<c<<"."<<d<<endl; } return 0; }
方法二:该种方法比较简便。
#include<iostream> using namespace std; union IPResult { unsigned long IP; unsigned char Sub[4]; }; int main() { long N; IPResult ipre; while (scanf("%ld",&N)!=EOF) { ipre.IP=0xFFFFFFFF; long m=1; N+=3; while (m<N) { m=m<<1; } ipre.IP=ipre.IP-(m-1); printf("%u.%u.%u.%u\n",ipre.Sub[3],ipre.Sub[2],ipre.Sub[1],ipre.Sub[0]); } return 0; }
时间: 2024-11-09 03:50:31