【问题标题】:Trouble Understanding How to Set Bits无法理解如何设置位
【发布时间】: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) -&gt; 0xA1B2C3DE

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

【问题讨论】:

  • 这个函数到底应该做什么?
  • @Dmitri 应该将位位置 pos, pos + 1, ..., pos + n - 1 的 n 个连续位值中的每一个设置为位值 1,并打印出结果为十六进制。
  • mask = (mask &lt;&lt; n)-pos-1 似乎没有意义,是吗?您正在从掩码本身中减去位置(减 1)并使其成为新掩码。
  • 也许value | ((1u &lt;&lt; n) - 1) &lt;&lt; pos(1u &lt;&lt; n) - 1 获得正确数量的设置位,然后移入位置,并与value 或以设置所有位。
  • 1u 只是 1 作为无符号整数。

标签: c bit


【解决方案1】:

这里是函数的重写:

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

...设置nvalue中位位置pos开始的连续位并显示结果。

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

(1u &lt;&lt; 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

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 2010-11-07
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2020-09-03
    • 2023-01-17
    • 1970-01-01
    相关资源
    最近更新 更多