无法理解如何设置位

Trouble Understanding How to Set Bits

对于我的系统 class 中的一项作业,我们正在学习位操作的工作原理,但我无法将其实现到此函数中:

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

我就是不明白逻辑是怎么回事。我想我了解基本知识,例如如何修改位以及屏蔽的工作原理,但我不确定如何将它们放在一起。我的 class 论坛没有用,我的教授也没有回复电子邮件,所以我来这里是最后的手段。任何回应将不胜感激。我不想在余下的职业生涯中都讨厌十六进制。

这里是函数的重写:

void setting_bits(unsigned value, int pos, int n) {
    printf("\nsetting_bits(0x%X, %i, %i) -> ",value,pos,n);

    unsigned n_val = value | ((1u << n) - 1) << pos;
    
    printf("0x%X\n", n_val);
}

...从 value 中的位位置 pos 开始设置 n 个连续位并显示结果。

这里的关键部分是value | ((1u << n) - 1) << pos

(1u << n) 让我们设置一位,然后是 n 零位。然后我们从中减去 1,这给了我们 n 设置位。然后我们将所有剩下的内容移动 pos 以使其进入正确的位置。最后,我们将它与旧值按位或运算,这给了我们价值,但如果它们尚未设置,则所有这些位都已设置。

使用8位二进制的例子,value为0101 0101,n为3,pos为2:

(1u << n)                       -->   00000001b << 3        --> 00001000b
((1u << n) - 1)                 -->   00001000b - 1         --> 00000111b
((1u << n) - 1) << pos          -->   00000111b << 2        --> 00011100b
value | ((1u << n) - 1) << pos  -->   01010101b | 00011100b --> 01011101b