在C中, 我有一个32位字表示一个地址(我把它存储在一个无符号长,希望没问题)。现在从我收集的内容来看,地址的一部分包含页码,另一部分包含偏移量。我想知道如何只提取给我页码的位。我已经计算出前22个最重要的位是页码,其他10位是页面偏移。我怎样才能抓住页码的位?我想我可以通过一些按位操作来做到这一点,但我不确定如何。
答案 0 :(得分:11)
使用bitshift运算符提取所需的位。
pageNumber = x >> 10;
offset = x & ((1 << 10) - 1);
对于页码,&gt;&gt;运算符向下移位,所以你失去了最不重要的位。
对于偏移量,((1 <&lt; 10)-1)创建一个由10个1组成的位掩码,用于仅选择10个最低有效位并忽略最高有效位。
答案 1 :(得分:2)
我是“两班制”场提取方法的忠实粉丝。它既有签名也有无签名。从w
中提取宽度为lsb
且字段为word
的字段为#define BITSIN(W) (8*sizeof(W))
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width);
的字段:
BITSIN(word) == 32
在这种情况下,lsb+width == 32
和x << y
,只要有问题的单词是无符号的,你就可以在没有遮挡的情况下向右移动10。
一个警告:要注意32位类型的32位移位! C标准允许编译器执行任何操作,而常见的英特尔芯片无效:x
将y % 32
移位x
位(提供{{1}}具有32-位整数类型)。这意味着如果您尝试将32位整数向左或向右移位32位,则结果与无操作相同。 64位类型的64位移位存在类似的问题。