首页 > 解决方案 > 无法理解如何设置位

问题描述

对于我的系统课上的作业,我们正在学习位操作的工作原理,但我在将其实现到这个函数中时遇到了麻烦:

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

我只是不明白如何去逻辑。我想我了解如何修改位以及掩码如何工作等基础知识,但我不确定如何将它们放在一起。我的课堂论坛没有用,我的教授也没有回复电子邮件,所以我是最后的手段。任何回应将不胜感激。我不想在余下的职业生涯中讨厌十六进制。

标签: cbit

解决方案


这是函数的重写:

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);
}

...设置从位位置开始的n连续位并显示结果。posvalue

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

(1u << n)让我们设置一个位,后跟n零位。然后我们从中减去 1,这给了我们n设置位。然后我们将所有的左边pos移到正确的位置。最后,我们将它与为我们提供价值的旧值进行按位或,但如果它们尚未设置,则将所有这些位设置为。

使用 8 位二进制的示例,value分别为 0101 0101、3npos2:

(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

推荐阅读