,一,掩码形如:“255.255.255.0”转化为位 数24,思路如下:
- 判断传入的掩码字符串是否是ip,最简单的方法使用正则,直接进行匹配,代码如下:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public static boolean isMask(String mask){
Pattern pattern = Pattern.compile("(^(\\d{1,3}\\.){3}\\d{1,3}$)");
import java.util.regex.Pattern;
public static boolean isMask(String mask){
Pattern pattern = Pattern.compile("(^(\\d{1,3}\\.){3}\\d{1,3}$)");
return pattern.matcher(mask).matches();
}
}
2. 判断IP中1个数,我使用的思路,将掩码转化为整形,对整形进行判断1的个数。
2.1 将IP转化为整形
public static int ipToInt(String ipAddr) { if(!isMask(ipAddr))
return 0;
String[] ipArr = ipAddr.split("\\.");
return ((Integer.parseInt(ipArr[0]) & 0xFF) <<24) + ((Integer.parseInt(ipArr[1]) & 0xFF) << 16)
+ ((Integer.parseInt(ipArr[2]) & 0xFF)) << 8 + ((Integer.parseInt(ipArr[3]) & 0xFF));
}
2.2 对整数进行数1操作:
public staticint findNumberOf1(int n)
{
int countOf1=0;
int tag=1;
while(tag != 0)
{
if((tag&n) !=0)
countOf1++;
tag=tag<<1;
}
return countOf1;
}
二,掩码位数转化为IP形式,思路如下:
public static String intToMask(int bitMask)
{
if(bitMask > 32)
return null;
int tmpMask[] = {0,0,0,0};
int times = bitMask / 8;
int i = 0;
for(; i < times ; i++)
{
tmpMask[i] = 255;
}
for(int j = 1; j <= 8; j++)
{
if(j <= bitMask - times*8)
tmpMask[i] = 2*tmpMask[i] + 1;
else
tmpMask[i] = 2*tmpMask[i];
}
return Integer.toString(tmpMask[0]) + "." + Integer.toString(tmpMask[1]) + "." + Integer.toString(tmpMask[2]) + "." + Integer.toString(tmpMask[3]);
}