我对使用位操作有两个疑问:
第一个是>>运营商。据我所知,这个运算符执行此操作
0001 0000>> 4 - > 0000 0001或此1111 0001,不确定它是否填充1或0
所以我有这段代码:
version_ihl = iph[0]
version = version_ihl >> 4
ihl = version_ihl & 0xF
假设IP版本是4:0100,IHL是5:0101
如果我这样做版本= version_ihl>> 4,结果将是
0100 0101 ---> 0000 0100,如果运营商>>不填写1,我已经读过它实际上,所以而不是IP Version = 4将是1111 0100,而不是4。
第二件事是这一行,如何用ihl = version_ihl & 0xF
最终结果是5,所以0000 0101并且据我所知,该运算符执行了所有1的掩码,因此0100 0101将保持不变。所以这两个问题是:
1.如何从0100 0101获得>> 4操作结果0000 0100如果>>应该填写1s?
2.如何从0100 0101获得结果0000 0101和& 0xF mask??
我发布的代码工作正常,所以解决方案就在那里,我只是想知道它为什么会这样。提前谢谢你,希望有人可以通过一些了解。
答案 0 :(得分:1)
>>
运算符未填充"什么都有。 Python中的整数表现得好像它们具有无限数量的前导零(非负整数)或1(负整数)。右移只会丢弃 n 最低有效位。0xF
与0b1111
相同,后者又与0b00001111
相同。你只是用那些掩盖了最不重要的nybble。由于您要求提供更多详细信息:
0100 0101
开始,右移4。那个完全等同于以0000 0100 0101
开头,右移4,这给你0000 0100
。反过来,这与0100
相同。0100 0101
开始,并使用0xF
屏蔽。 0xF
只是1111
,与0000 1111
相同。因此,您可以获得0000 0101
或0101