私はいくつかの古くて悪い文書化されたCコードで以下を見つけました:
#define addr (((((147 << 8) | 87) << 8) | 117) << 8) | 107
それは何ですか?私はそれがIPアドレスであることを知っています-そして8ビットを左にシフトすることもある程度意味があります。しかし、誰かが私にこれを全体として説明できますか?そこで何が起こっているのですか?
ありがとうございました!
コード
(((((147 << 8) | 87) << 8) | 117) << 8) | 107
IP147.87.117.107を含む4バイトを生成します。最初のステップは、最も内側のブラケットです。
147<<8
147 = 1001 0011
1001 0011 << 8 = 1001 0011 0000 0000
2番目のバイト87は、ビット単位または(147 << 8)の演算によって挿入されます。ご覧のとおり、右側の8ビットはすべて0(<< 8のため)であるため、ビット単位の演算では、87から8ビットが挿入されます。
1001 0011 0000 0000 (147<<8)
0000 0000 0101 0111 (87)
------------------- bitwise-or
1001 0011 0101 0111 (147<<8)|87
同じことが残りの部分でも行われるため、最後に4バイトが単一の32ビット整数に保存されます。
IPv4アドレスは4バイトで構成されているため、32ビット整数で格納できます。これは、IPアドレスの4つの部分(147.87.117.107)を取得し、ビットシフトとビット単位のOR演算子を使用して、アドレスを単一の4バイト量で「エンコード」します。
(注:アドレスは107.117.87.147である可能性があります-バイトがどの順序で格納されているかをすぐに思い出せません。)
結果の数量の(16進)バイトは次のようになります。
aabb ccdd
ここで、aaは147(0x93)の16進表現、bbは87(0x57)、ccは117(0x75)、ddは107(0x6b)であるため、結果の値は9357756bになります。
更新: IPv6アドレスは32ビットではなく128ビットであるため、これはIPv6には適用されません。