不正确地更新位字段

时间:2017-02-15 20:30:36

标签: c bit-manipulation

我正在尝试解决一个问题。它说,

  

将新变量初始化为值17512807u。

     

假设我们将通常从0开始的数字编号为最不重要(在   右)到31(最重要的,在左边)。更新位18到   21具有整数值8和位10至14,值为17   (十进制)。将结果值打印为八位十六进制数   数字显示所有数字。

这是我提出的代码:

#include <stdio.h>

int main(){
    int value = 17512807u;
    int L = 21; // starting left position
    int R = 18; // starting right position

    int mask = (1 << (L - R + 1) - 1) << R; 
    int newField = (8 << R) & mask; // integer value 8, shifting to right
    int newValue = value & (~mask); // remove range of bits
    value = newField | newValue; // update range of bits

    L = 14;
    R = 10;

    mask = (1 << (L - R + 1) - 1) << R;
    newField = (17 << R) & mask;
    newValue = value & (~mask);
    value = newField | newValue;

    printf("%08x\n", value);
}

我得到的答案是012b7d67

然而,我被告知这是错误的答案。我不知道答案是什么。

3 个答案:

答案 0 :(得分:1)

int mask = ((1 << (L - R + 1)) - 1) << R;

答案 1 :(得分:0)

您计算mask的表达式不正确。您更改了第二个表达式中的括号但两个都不正确,甚至不编译:

int mask = ((1 << (L - R + 1) - 1) << R;
...
mask = ((1 << (L - R + 1) - 1 << R);

应写成:

mask = ((1UL << (L - R + 1)) - 1) << R;

答案 2 :(得分:0)

看起来你要做的就是使用位字段。例如,给定类型

struct bits{
    int a:5;
    unsigned short b:3;
    unsigned char c:2;
    bool d:1;
};

以上struct将有4个成员,每个成员具有特定的位长。

如果你union结构int,你会得到一个&#34;双视图&#34;的比特。作为单个整数的字段列表:

union U{
    struct bits fields;
    int i;
};

现在代码如

U u;
u.i = 0;
u.fields.b = true;

变为有效,并允许您访问整个数字或单个位字段。