package com.livingforu.test0010;
public 
class IPTransferToLong {
	/**
	 * 将IP转化为Long型
	 * @param ipaddr
	 * @return
	 */
	private static Long setIP(String ipaddr) { 
		   String ip[] = ipaddr.split("\\.");  
		   Long ipLong = 256 * 256 * 256 * Long.parseLong(ip[0]) 
		               + 256 * 256 * Long.parseLong(ip[1]) 
		               + 256 * Long.parseLong(ip[2]) 
		               + Long.parseLong(ip[3]);    
		   return ipLong;  
	}
	/**
	 * 将Long型转化为IP
	 * @param ipaddr
	 * @return
	 */
	private static String getIP(Long ipaddr) { 
		 long y = ipaddr % 256;
		 long m = (ipaddr - y) / (256 * 256 * 256); 
		 long n = (ipaddr - 256 * 256 *256 * m - y) / (256 * 256); 
		 long x = (ipaddr - 256 * 256 *256 * m - 256 * 256 *n - y) / 256;
		 return m + "." + n + "." + x + "." + y;
	}
	
	public static String getIPNetworkAddr(String ipaddr,String mask){
		//IP地址和子网掩码与得到网络地址
		Long ipNetworkAddr = setIP(ipaddr)&setIP(mask);
		//网络地址和子网掩码异或后取反可以得到广播地址---就这搞不定了。。。。。。。
		//在做位运算的时候,要明确写明操作数据的类型,Long型不加L,如果小于32位,默认按照32位存储
		Long ipBroadcastAddr = ((ipNetworkAddr^setIP(mask))^0xffffffffL);
		/*System.out.println(Long.toBinaryString(0xffffffffL));
		System.out.println(Long.toBinaryString(ipNetworkAddr^setIP(mask)));
		System.out.println(Long.toBinaryString(ipBroadcastAddr));*/
		return getIP(ipNetworkAddr+1)+"-->"+getIP(ipBroadcastAddr-1);
	}
	
}