原题 https://www.codewars.com/kata/int32-to-ipv4/train/java
Take the following IPv4 address: 128.32.10.1
This address has 4 octets where each octet is a single byte (or 8 bits).
- 1st octet
128
has the binary representation:10000000
- 2nd octet
32
has the binary representation:00100000
- 3rd octet
10
has the binary representation:00001010
- 4th octet
1
has the binary representation:00000001
So 128.32.10.1
== 10000000.00100000.00001010.00000001
Because the above IP address has 32 bits, we can represent it as the unsigned 32 bit number: 2149583361
Complete the function that takes an unsigned 32 bit number and returns a string representation of its IPv4 address.
Examples
2149583361 ==> "128.32.10.1" 32 ==> "0.0.0.32" 0 ==> "0.0.0.0"
solution :
public class Kata { public static String longToIP(long ip) { //1. translate the ip to binary representation String str = ""; if (ip == 0) { str = ip + ""; } else { while (ip != 0) { str = ip % 2 + str; ip = ip / 2; } } //2. if the binary string short than 32 bit, then add "0" in front while (str.length() != 32) { str = "0" + str; } String result = ""; //3. truncate the str to four items for (int i = 0; i < 4; i++) { String partStr = str.substring(i * 8, 8 * (i + 1)); //4. translate every item to decimal number int bi = Integer.parseInt(partStr, 2); if (i == 3) { result += bi + ""; } else { result += bi + "."; } } return result; } }
CW上的大神解:
1.
public class Kata { public static String longToIP(long ip) { return String.format("%d.%d.%d.%d", ip>>>24, (ip>>16)&0xff, (ip>>8)&0xff, ip&0xff); } }
2.
public class Kata { public static String longToIP(long ip) { String[] e = new String[4]; int i = 4; while (i-- != 0) { e[i] = "" + (ip % 256); ip /= 256; } return String.join(".",e); } }
3.
public class Kata { public static String longToIP(long ip) { return IntStream.rangeClosed(1, 4) .mapToObj(i -> String.valueOf(ip >> (32 - 8 * i) & 255)) .collect(Collectors.joining(".")); } }