C 迷你拼图IP报头

C 迷你拼图IP报头,c,ip,c-preprocessor,C,Ip,C Preprocessor,请看以下代码: #define IP_HL(ip) (((ip)->ip_vhl) & 0x0f) #define IP_V(ip) (((ip)->ip_vhl) >> 4) 完整代码在这里 我知道在ip_vhl中的8位中: IP_HL使用0000 1111进行操作(&O),这意味着我们得到最后四位 IP_V将位模式向右移动四位,ehich也会给我们最后四位 我检查了代码,它工作正常:IP版本显示4,头大小显示5 它如何返回不同的

请看以下代码:

#define IP_HL(ip)       (((ip)->ip_vhl) & 0x0f)
#define IP_V(ip)        (((ip)->ip_vhl) >> 4)
完整代码在这里

我知道在
ip_vhl
中的8位中:

  • IP_HL
    使用0000 1111进行操作(&O),这意味着我们得到最后四位
  • IP_V
    将位模式向右移动四位,ehich也会给我们最后四位
我检查了代码,它工作正常:IP版本显示4,头大小显示5

它如何返回不同的数字?
我的理解有什么问题?

没有,
IP\u V
将一个位模式向右移动四位,这给了我们前四位(假设它是一个8位的值)

更详细地说,假设位模式
abcdefgh

  abcd efgh         abcd efgh
& 0000 1111              >> 4
  =========         =========
  0000 efgh         0000 abcd
>4
操作丢弃右侧存在的位,并输入左侧的
0
位。因此,一次一点的值将给出:

abcd efgh     --> direction of shift
0abc defg
00ab cdef
000a bcde
0000 abcd

如果您的位是0011 0101,则>>4将为您提供0000 0011,因为您已将所有内容移动到正确的4个位置,并丢失了0101位。

对不起,不明白:)您能举个例子吗谢谢,我将按照您的回答回答first@maximilliano,不要接受答案,因为这是第一个答案,精英管理也是第一个答案,你应该接受它,因为它是最好的。当然,你还是应该接受它:-)