k&r与位操作混淆

svr*_*svr 5 c kr-c bit-manipulation

练习是:写一个函数setbits(x,p,n,y)返回x,其中n位从位置p开始,设置为y的最右边n位,其他位保持不变.

我尝试解决方案是:

#include <stdio.h>

unsigned setbits(unsigned, int, int, unsigned);

int main(void)
{
    printf("%u\n", setbits(256, 4, 2, 255));
    return 0;
}

unsigned setbits(unsigned x, int p, int n, unsigned y)
{
    return (x >> (p + 1 - n)) | (1 << (n & y));
}
Run Code Online (Sandbox Code Playgroud)

这可能不正确,但我在正确的道路上吗?如果没有,我做错了什么?我不确定为什么我不完全理解这一点,但我花了大约一个小时试图想出这个.

谢谢.

Ign*_*ams 5

这是你的算法:

  1. 如果n为0,则返回x.
  2. 取1,然后左移n次,然后减去1.调用它mask.
  3. 左移掩码p次调用此mask2.
  4. Andx与mask2的反转.Andy带面具,左移p次.
  5. Or 这两个操作的结果,并返回该值.