在C语言中更新位字段

在C语言中更新位字段,c,bit-manipulation,bit,C,Bit Manipulation,Bit,我想解决一个问题说 将新变量初始化为值17512807u 假设我们像往常一样从0开始对位进行编号,将其作为最低有效位(在 右)至31(最显著,在左侧)。更新第18位至第18位 21的整数值为8,位10到14的整数值为17 (十进制)。将结果值打印为八位十六进制 显示所有数字的数字 我知道我需要做什么,我的代码运行良好,但我被告知我的答案不正确 #include <stdio.h> int main(){ int value = 17512807u; int L =

我想解决一个问题说

将新变量初始化为值17512807u

假设我们像往常一样从0开始对位进行编号,将其作为最低有效位(在 右)至31(最显著,在左侧)。更新第18位至第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);
}
#包括
int main(){
整数值=17512807u;
int L=21;//开始左位置
int R=18;//起始右位置

int mask=(1看起来要求您使用位字段

struct bits{
    int a:5;
    unsigned short b:3;
    unsigned char c:2;
    bool d:1;
};
上面的
struct
将有4个成员,每个成员具有特定的位长度

如果使用
union
将该结构与
int
结合,则会得到位的“双视图”。作为字段列表或单个整数:

union U{
    struct bits fields;
    int i;
};
现在代码是

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

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

最近。在被建议使用
无符号
?WeatherVane之后,为什么您仍然使用
int
类型表示
17512807u
值?我试过了,它没有任何变化,所以我想您会继续忽略@Olaf?我不知道我不明白为什么人们会问问题,然后盲目地继续。在这种情况下,int保证是32位。正如我所说,我确实把它改成了unsigned,这没有什么区别。嗯,我认为bit字段唯一可用的指定类型是
\u Bool,int,signed int,unsigned int。
字符c:2
可能是个问题。可能想把你的答案发到谢谢,@chux。更新了答案并交叉发布。