我试图解决一个问题,
将新变量初始化为值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);
}
由于我不知道正确的答案,而且我给出的唯一信息是我的答案是错的,我不明白我做错了什么。
答案 0 :(得分:0)
看起来你要做的就是使用位字段。例如,给定类型
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;
变为有效,并允许您访问整个数字或单个位字段。