uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

どう書く.org課題「 IPv4アドレスのマスクの変換 」

IPv4アドレスのマスクの変換もやってみた。投稿したあとでゲンゾウさんのを見ると、「Integer/Long.toBinaryString」というメソッドやcountというメソッドを使ってたのでさすがと思いました。以下はそれを取り込んだバージョン。

def netMask(addr) {
  Long.toString(addr.split(/\./).inject(0){a,b->a*256+(b as long)},2).count('1')
}

assert netMask("255.255.255.0")==24
assert netMask("255.255.255.128")==25
assert netMask("255.255.255.255")==32

その逆変換

def mask2addr(mask){
  mask = (-1 << (32-mask))
  (3..0).collect{(mask >> it*8) & 0xff}.join('.')
}


assert mask2addr(24)=="255.255.255.0"
assert mask2addr(25)=="255.255.255.128"
assert mask2addr(32)=="255.255.255.255"