整數(shù)形式轉(zhuǎn)換成IP地址
思路:
- 將整數(shù)值進行右移位操作(>>>),右移24位,右移時高位補0,得到的數(shù)字即為第一段IP。ps:>>>是有符號整數(shù)右移運算符,>>是無符號整數(shù)右移運算符。
- 通過與操作符(&)將整數(shù)值的高8位設為0,再右移16位,得到的數(shù)字即為第二段IP。
- 通過與操作符吧整數(shù)值的高16位設為0,再右移8位,得到的數(shù)字即為第三段IP。
- 通過與操作符吧整數(shù)值的高24位設為0,得到的數(shù)字即為第四段IP。
public class numberchangetoip {
public static void main(String[] args) {
long ip = 3232235521l;
StringBuffer result = new StringBuffer();
result .append(String.valueOf((ip >> 24)));//直接右移24位
result .append(".");
result .append(String.valueOf((ip & 0x00FFFFFF) >> 16));//將高8位置0,然后右移16位
result .append(".");
result .append(String.valueOf((ip & 0x0000FFFF) >> 8));//將高16位置0,然后右移8位
result .append(".");
result .append(String.valueOf((ip & 0x000000FF)));//將高24位置0
System.out.println(result.toString());
}
}
運行結(jié)果:

IP地址轉(zhuǎn)換成整數(shù)形式
其實我面試的時候只有上面一個問題,但是怎能輕易放過這個問題呢。
思路
- 通過String的split()方法根據(jù)IP字符串中的".",將其分成四段。
- 通過Long的parseLong方法將每一段轉(zhuǎn)化成一個3位整數(shù)。
- 通過左移位操作(<<)給每一段的數(shù)字加權,第一段的權為2的24次方,第二段的權為2的16次方,第三段的權為2的8次方,最后一段的權為1。
public static void main(String[] args) {
String ip = "192.168.0.1";
String[] items = ip.split("\\.");
long[] nums = new long[4];
for (int i = 0; i < items.length; i++) {
nums[i] = Long.parseLong(items[i]);//將分出的每一個數(shù)字字符串轉(zhuǎn)換成long型
System.out.println(nums[i] + ":" + Long.toBinaryString(nums[i]));//每一個數(shù)字與其對應的二進制表示
}
long result = (nums[0] << 24) + (nums[1] << 16) + (nums[2] << 8) + nums[3];
System.out.println(Long.toBinaryString(result));
System.out.println(result);
}
}
運行結(jié)果:

當然,以上只是大致思路,還有多處細節(jié)需要考慮:
- ip 地址是有范圍的,所以要對無意義的進行檢驗。
- 輸入非法,如空或負數(shù)。