どういった時に使用するのか、よく分からなかったビット演算。MACアドレスが正しいフォーマットか調べる必要があって、
ここのコードを参考にしていた時に、こういう使い方があるのかと思ったのでメモ。
def _mac2int(addr, sep=_MACsep):
# convert a MAC str to an int
h = addr.split(sep)
if len(h) > 4:
i = 0
for b in h:
b = int(b, 16)
if 0 <= b < (1<<8):
i = (i << 8) | b
else:
break
else:
if 0 < i < (1<<48):
return i
raise ValueError('invalid MAC address: %r' % (addr,))
MACアドレスの文字列を int に変換している関数で、失敗すると ValueError になるようになっています。
その中でビット演算が使用されているのですが、分かりやすくするために'FF:FF'を変換するとした場合、まず左側の'FF'を int に変換します。
>>> int('FF', 16)
255
>>> bin(255)
'0b11111111' <= 2進数にするとこうなる
次に、最初に変換した部分を 8bit 左にずらして、同様に次の'FF'を int に変換し、ビットOR をとる。
>>> 255 << 8
65280
>>> bin(65280)
'0b1111111100000000'
>>> bin(255)
'0b11111111'
>>> 65280 | 255
65535
>>> bin(65535)
'0b1111111111111111'
>>> bin(0xFFFF)
'0b1111111111111111'
結果、0xFFFF を int に変換したのと同じになります。MACアドレスは 6オクテットなので、これを6回繰り返すとMACアドレスを int に変換できるんですね。勉強になりました。
0 件のコメント:
コメントを投稿