ip2int()
{
    local a b c d
    local i j k
    { IFS=. read a b c d; } <<< $1
    #echo $(((((((a << 8) | b) << 8) | c) << 8) | d))
    
    j=0;
    for k in a b c d
    do
      i=8;
      while [ $i != 0 ]
      do
       let i=$i-1
       if [ $((k & ( 0x1 << $i))) != 0 ]; then
         let j=$j+1;
       else
         echo $j
         return;
       fi
      done
    done
}

int2ip()
{
    local ui32=$1; shift
    local ip n
    for n in 1 2 3 4; do
        ip=$((ui32 & 0xff))${ip:+.}$ip
        ui32=$((ui32 >> 8))
    done
    echo $ip
}

mask2int()
{
    local a b c d
    local i j k
    { IFS=. read a b c d; } <<< $1
    
    j=0;
    for k in a b c d
    do
      i=8;
      while [ $i != 0 ]
      do
       let i=$i-1
       if [ $((k & ( 0x1 << $i))) != 0 ]; then
         let j=$j+1;
       else
         echo $j
         return;
       fi
      done
    done
}

netmask()
{
    local mask=$((0xffffffff << (32 - $1))); shift
    int2ip $mask
}

broadcast()
{
    local addr=$(ip2int $1); shift
    local mask=$((0xffffffff << (32 -$1))); shift
    int2ip $((addr | ~mask))
}

network()
{
    local addr=$(ip2int $1); shift
    local mask=$((0xffffffff << (32 -$1))); shift
    int2ip $((addr & mask))
}


