提取位

时间:2009-11-29 22:42:51

标签: c bit-manipulation memory-address

在C中, 我有一个32位字表示一个地址(我把它存储在一个无符号长,希望没问题)。现在从我收集的内容来看,地址的一部分包含页码,另一部分包含偏移量。我想知道如何只提取给我页码的位。我已经计算出前22个最重要的位是页码,其他10位是页面偏移。我怎样才能抓住页码的位?我想我可以通过一些按位操作来做到这一点,但我不确定如何。

2 个答案:

答案 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 == 32x << y,只要有问题的单词是无符号的,你就可以在没有遮挡的情况下向右移动10。

一个警告:要注意32位类型的32位移位! C标准允许编译器执行任何操作,而常见的英特尔芯片无效:xy % 32移位x位(提供{{1}}具有32-位整数类型)。这意味着如果您尝试将32位整数向左或向右移位32位,则结果与无操作相同。 64位类型的64位移位存在类似的问题。

相关问题