练习是: 编写一个函数 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));
}
这可能不正确,但我走的路对吗?如果不是,我做错了什么?我不确定为什么我不能完全理解这一点,但我花了大约一个小时试图想出这个。
谢谢。
最佳答案
这是你的算法:
- 如果n为0,返回x。
- 取 1,左移 n 次,然后减去 1。调用此
掩码
。 - 左移掩码 p 次调用此
mask2
。 And
x 与 mask2 的倒数。和
y 带掩码,左移 p 次。或
这两个操作的结果,并返回那个值。
关于c - k&r 与位操作混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2076084/