I wrote this up earlier in the year (among other times) and thought I should archive it here.

Please note that this example uses 10.x.x.x, which is a non-routable
block. This is reserved for everyone to use, and no one may broadcast
interdomain routes for it. Typically, if public internet access is needed
from a 10.* or 192.168.* network, then NAT would be used.
Working with a route like::
10.0.208/20 10.0.223.225
The /20 means the first 20 bits are on within this 32-bit mask. In
binary, this would be:
1111 1111 1111 1111 1111 0000 0000 0000
To convert to hex, each 4 bits = 1 nybble. 1 nybble is one hex digit. 2
nybbles = 1 byte. This yields a netmask of:
f f f f f 0 0 0
Converted to standard dotted radix 10 (decimal) notation, this would be:
255.255.240.0
This is also called a dotted quad because it's 4 bytes.
A byte is also called an octed in networking, meaning 8 bits, because some
systems do not use 8-bit bytes.
Technically, you can represent an IP address as a 32-bit unsigned integer.
So we subtract 255.255.250.0 from 255.255.255.255
0.0.15.255 is your inverse bit mask
To get the broadcast address from the network address and mask, Add the
inverse bitmask value to the network address
10.0.208.0 plus 0.0.15.255 yields 10.0.223.255
Assume you know you're 10.0.209.47 with netmask as above, how would you determine the network and
broadcast
addresses?
Basically, networks don't span outside of thier netmask boundary, so you
make a table of netmask/broadcasts.
In building your table, start with the supernet (dot-zero for your highest
variable octet). In this instance, it would be
10.0.x.x
So network 1 would be
10.0.0.0
Add the inverse netmask of 0.0.15.255 to get broadcast number 1
10.0.15.255
Next network (eg next possible IP address) is
10.0.16.0
So following the same rules, the next broadcast is
10.0.31.255
Following this through the whole supernet, The table for 10.0.x.x with netmask of 255.255.240.0
is:
Network Broadcast
--------------------------------
10.0.0.0 10.0.15.255
10.0.16.0 10.0.31.255
10.0.32.0 10.0.31.255
10.0.48.0 10.0.63.255
10.0.64.0 10.0.79.255
10.0.80.0 10.0.95.255
10.0.96.0 10.0.111.255
10.0.112.0 10.0.127.255
10.0.128.0 10.0.143.255
10.0.144.0 10.0.159.255
10.0.160.0 10.0.175.255
10.0.176.0 10.0.191.255
10.0.192.0 10.0.207.255
10.0.208.0 10.0.223.255
10.0.224.0 10.0.239.255
10.0.240.0 10.0.255.255
For your network, pick the closest previous network address.
In our example, 10.0.209.47 would be within 10.0.208.0 with a netmask of 10.0.223.25.