HDU ACM 2207 IP的计算(二)

方法一:计算掩码位数有两种方法,使用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;}

,辽远或偏僻的地方,而会常常想起这一次的旅行,想起那座山,那个城,那些人……

HDU ACM 2207 IP的计算(二)

相关文章:

你感兴趣的文章:

标签云: