【发布时间】:2021-01-24 03:00:54
【问题描述】:
对于我的系统课上的一项作业,我们正在学习位操作的工作原理,但我无法将其实现到这个函数中:
void setting_bits(int value, int pos, int n) {
int n_val = value;
printf("\nsetting_bits(0x%X, %i, %i) -> ",value,pos,n);
int mask = 1;
mask = (mask << n)-pos-1;
n_val = n_val & ~mask;
printf("0x%X",n_val);
printf("\n");
}
这是一个示例输入输出:
setting_bits(0xA1B2C3D4, 1, 4) -> 0xA1B2C3DE
我只是不明白如何进行逻辑。我想我了解如何修改位以及掩码如何工作等基础知识,但我不确定如何将它们放在一起。我的课堂论坛没有被证明有用,我的教授也没有回复电子邮件,所以我在这里是万不得已的。任何回应将不胜感激。我不想在余下的职业生涯中讨厌十六进制。
【问题讨论】:
-
这个函数到底应该做什么?
-
@Dmitri 应该将位位置 pos, pos + 1, ..., pos + n - 1 的 n 个连续位值中的每一个设置为位值 1,并打印出结果为十六进制。
-
mask = (mask << n)-pos-1似乎没有意义,是吗?您正在从掩码本身中减去位置(减 1)并使其成为新掩码。 -
也许
value | ((1u << n) - 1) << pos?(1u << n) - 1获得正确数量的设置位,然后移入位置,并与value或以设置所有位。 -
1u只是 1 作为无符号整数。