方法一:计算掩码位数有两种方法,使用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;
}原文地址:http://blog.csdn.net/a809146548/article/details/44199013