码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 2207 IP的计算(二)

时间:2015-03-11 17:29:36      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:c   c++   算法   acm   位运算   

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

标签:c   c++   算法   acm   位运算   

原文地址:http://blog.csdn.net/a809146548/article/details/44199013

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!