为什么在Socket Programming-C中将位移8?

Kor*_*gay 1 c sockets ip bit-manipulation

我正在研究FreeBSH开发人员手册,在那里我看到了这个用于Socket编程的代码:

struct sockaddr_in sa;
sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);
Run Code Online (Sandbox Code Playgroud)

为什么按位移位和/或在这里使用?

我知道什么是按位移位和xor,我做了一个非常小的测试程序:

int c = 5;
printb(c);

int d = 5<<2;
printb(d);

int e = d | c;
printb(e);
Run Code Online (Sandbox Code Playgroud)

打印:

00000000000000000000000000000101
00000000000000000000000000010100
00000000000000000000000000010101
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么sa.sin_addr.s_addr我需要移动ip和/或它以下值.谁能解释一下?

ffe*_*rri 8

它正在为IP 192.43.244.18创建二进制表示.

让我们一个一个地分析每个操作.

从这些常量的二进制表示开始:

192 = 11000000
 43 = 00101011
244 = 11110100
 18 = 00010010
Run Code Online (Sandbox Code Playgroud)

最内在的操作:

(192 << 8) =

= 11000000 << 8 =

= 1100000000000000
Run Code Online (Sandbox Code Playgroud)

下一个:

(192 << 8) | 43 =

= 1100000000000000 |
          00101011 =

  1100000000101011
Run Code Online (Sandbox Code Playgroud)

下一个:

((192 << 8) | 43) << 8) =

= 1100000000101011 << 8 =

= 110000000010101100000000
Run Code Online (Sandbox Code Playgroud)

下一个:

(((192 << 8) | 43) << 8) | 244 =

= 110000000010101100000000 | 244 =

= 110000000010101100000000 |
                  11110100 =

= 110000000010101111110100
Run Code Online (Sandbox Code Playgroud)

下一个:

(((192 << 8) | 43) << 8) | 244) << 8 =

= 110000000010101111110100 << 8 =

= 11000000001010111111010000000000
Run Code Online (Sandbox Code Playgroud)

最后:

(((((192 << 8) | 43) << 8) | 244) << 8) | 18 =

= 11000000001010111111010000000000 | 18 =

= 11000000001010111111010000000000 |
                          00010010 =

= 11000000001010111111010000010010
Run Code Online (Sandbox Code Playgroud)