## The challenge

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

 ``````1 2 3 `````` ``````2149583361 ==> "128.32.10.1" 32 ==> "0.0.0.32" 0 ==> "0.0.0.0" ``````

## The solution in Java code

Option 1:

 ``````1 2 3 4 5 `````` ``````public class Solution { public static String longToIP(long ip) { return String.format("%d.%d.%d.%d", ip>>>24, (ip>>16)&0xff, (ip>>8)&0xff, ip&0xff); } } ``````

Option 2:

 ``````1 2 3 4 5 6 7 8 `````` ``````public class Solution { public static String longToIP(final long ip) { return ((ip >> 24) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + (ip & 0xFF); } } ``````

Option 3:

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 `````` ``````public class Solution { public static String longToIP(long ip) { StringBuilder sb = new StringBuilder(); long mask = (1<<8)-1; sb.append(ip>>>24 & mask); sb.append('.'); sb.append(ip>>>16 & mask); sb.append('.'); sb.append(ip>>>8 & mask); sb.append('.'); sb.append(ip & mask); return sb.toString(); } } ``````

## Test cases to validate our solution

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 `````` ``````import org.junit.Test; import java.util.Random; import static org.junit.Assert.assertEquals; public class SolutionTest { @Test public void sampleTest() { assertEquals("128.114.17.104", Solution.longToIP(2154959208L)); assertEquals("0.0.0.0", Solution.longToIP(0)); assertEquals("128.32.10.1", Solution.longToIP(2149583361L)); } private static Random random = new Random(); private static String solution(long ip) { return (ip >>> 24) % 256 + "." + (ip >>> 16) % 256 + "." + (ip >>> 8) % 256 + "." + ip % 256; } @Test public void randomTest() { final int Tests = 100; for (int i = 0; i < Tests; ++i) { long thirtyBits = random.nextInt(1 << 30); long twoBits = random.nextInt(1 << 2); long fullRange = (thirtyBits << 2) | twoBits; String expected = solution(fullRange); String actual = Solution.longToIP(fullRange); assertEquals(expected, actual); } } } ``````