c - k&r 与位操作混淆

标签 c bit-manipulation kr-c

练习是: 编写一个函数 setbits(x,p,n,y) 返回 x,其中从位置 p 开始的 n 位设置为 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));
}

这可能不正确,但我走的路对吗?如果不是,我做错了什么?我不确定为什么我不能完全理解这一点,但我花了大约一个小时试图想出这个。

谢谢。

最佳答案

这是你的算法:

  1. 如果n为0,返回x。
  2. 取 1,左移 n 次,然后减去 1。调用此掩码
  3. 左移掩码 p 次调用此 mask2
  4. And x 与 mask2 的倒数。 y 带掩码,左移 p 次。
  5. 这两个操作的结果,并返回那个值。

关于c - k&r 与位操作混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2076084/

相关文章:

python - 查询的最小异或

python - 我如何计算这个按位公式的倒数?

javascript - 获取 Uint16Array 成员的单独低字节和高字节

c - K&R C 练习帮助

c - 帮助自定义 getline() 函数

c - K&R 练习 1-21 - 心理不理解

c - 基于\0 终止的循环无法正常工作?

打字时光标离开窗口(ncurses)

c++ - 如何在 C++ 结构中表示每个 mips 指令行?

c - 将函数的输出按从高到低的顺序显示