|
ビット単位、論理、または:
>>> 0 | 1
1
>>> 1 | 1
1
Reduceはlambda
、関数の出力の現在の現在の合計と次の(整数)値を使用して呼び出しを減らしますmap()
。したがって、ループ内で次のことを実行しています。
sum = 0
for chunk in map(int, ip.split(".")):
sum = (sum << 8) | chunk
ここでmap(int, ip.split("."))
、IPアドレスを整数のシーケンスに変換しました。1.2.3.4
になり[1, 2, 3, 4]
ます。
これ<<
はビット単位の左シフトであり、この場合は8ビットです。
>>> 1 << 8
256
したがって、IPアドレスの整数部分ごとに、値を8桁左にシフトし、アドレスの次の部分のビットをその数値に追加します。
IPアドレスは32ビットの数値に過ぎず、文字列表記はその数値を8ビットの4つのチャンクに分割し、それらの8ビットのそれぞれの整数値を.
文字で「出力」するため、これは完全に理にかなっています。の間に。
各ステージを2進数として印刷すると便利です。
>>> map(int, '1.2.3.4'.split('.'))
[1, 2, 3, 4]
>>> bin(1)
'0b1'
>>> bin(2)
'0b10'
>>> bin(3)
'0b11'
>>> bin(4)
'0b100'
>>> bin(1 << 8)
'0b100000000'
>>> bin(1 << 8 | 2)
'0b100000010'
>>> bin((1 << 8 | 2) << 8)
'0b10000001000000000'
>>> bin((1 << 8 | 2) << 8 | 3)
'0b10000001000000011'
>>> bin(((1 << 8 | 2) << 8 | 3) << 8)
'0b1000000100000001100000000'
>>> bin(((1 << 8 | 2) << 8 | 3) << 8 | 4)
'0b1000000100000001100000100'