收集一些常见并且常规的题目。
ip转int,int转ip
思路:ip字符串以‘.’分割,每个分割部分最大为255,可以用一个byte存储,考虑分别使用int的四个byte字段存储ipv4的四个部分,要使用移位运算;int型的数字转换为ip是逆向的过程,考虑什么数据不需要加‘.’
public class Ip2IntUtils {
public static int ip2Int(String ip) {
if (ip == null) return -1;
String[] array = ip.split("\\.");
if (array.length != 4) return -1;
int number = 0;
for (int i = 0; i < array.length; i++) {
number |= Integer.valueOf(array[i]) << (24 - i * 8);
}
return number;
}
public static String int2Ip(int ip) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
int data = (ip >>> 24 - i * 8) & 0xff;
sb.append(data);
if (i != 3) {
sb.append(".");
}
}
return sb.toString();
}
public static void main(String[] args) {
String ip = "255.56.89.45";
int ipInt = ip2Int(ip);
System.out.println(ipInt);
System.out.println(int2Ip(ipInt));
}
}
进制转换
关于进制转换的理论描述https://www.cnblogs.com/gaizai/p/4233780.html
思路:看了理论,思路就很明显了,number取余的结果放入字符串,然后number取整,不断循环,直到number为0为止。对于不同的2、8、16进制的处理思路都是一样的,对于16进制的处理,要考虑取余数的结果超过10时怎么表示
public class DecimalUtils {
private static String[] converter = {"A", "B", "C", "D", "E", "F"};
/**
*
* @param number 待转换数字
* @param decimal
* @return
*/
public static String decimalConvert(int number, int decimal) {
if (number == 0) return "0";
StringBuilder sb = new StringBuilder();
while (number != 0) {
if (number % decimal >= 10) {
sb.append(converter[number % decimal - 10]);
} else {
sb.append(number % decimal);
}
number = number / decimal;
}
return replaceString(sb.toString());
}
public static String replaceString(String str) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = str.length()-1; i >= 0 ; i--) {
stringBuilder.append(str.charAt(i));
}
return stringBuilder.toString();
}
public static void main(String[] args) {
int number = 255;
int decimal = 16;
System.out.println(decimalConvert(number, decimal));
}
}