gpt4 book ai didi

c - K&R练习2.6位操作

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:59 25 4
gpt4 key购买 nike

“编写一个函数 setbits(x, p, n, y) 返回 x,其中从位置 p 开始的 n 位设置为 y 的最右边 n 位,其他位保持不变。”

我无法弄清楚我做错了什么。

#include <stdio.h>
unsigned setbits(unsigned int x, int p, int n, unsigned y);

int main()
{
unsigned x = 213;
unsigned y = 121;
int p = 4;
int n = 4;

x = setbits(x, p, n, y);
printf("%u\n", x);

getch();
return 0;
}
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return ((~(~0 << n) & y) << (p + 1 - n) | (~(~(~0 << n)) << (p + 1 - n) & x));
}

在纸面上,我的结果是 211,但我的代码生成的是 210。K&R 答案簿算法也返回 210。我不知道我在这里做错了什么。

编辑:这是答题簿中的代码:

unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return x & ~(~(~0 << n) << (p + 1 - n)) | (y & ~(~0 << n)) << (p + 1 - n);
}

重新编辑。我在将代码分解成单独的行时想通了。问题是最后一个 x 旁边的括号放错了位置:

//original
{
return ((~(~0 << n) & y) << (p + 1 - n) | (~(~(~0 << n)) << (p + 1 - n) & x));
}

//fixed
{
return ((~(~0 << n) & y) << (p + 1 - n)) | (~(~(~0 << n) << (p + 1 - n)) & x);
}

这是分解的代码。这看起来还很糟糕吗?我应该使用这样的变量吗:

int setbits(unsigned x, int p, int n, unsigned y)
{
unsigned z, k;

z = y & ~(~0 << n);
z = z << (p + 1 - n);
k = ~((~(~0 << n)) << (p + 1 - n));
k = k & x;

return z | k;
}

最佳答案

措辞有点难以理解,但我认为这就是它的要求:

<罢工>

<罢工>
unsigned setbits(unsigned int x, int p, int n, unsigned y){
return x | ((y&((1<<n)-1))<<(p-n));
}

<罢工>

unsigned setbits(unsigned int x, int p, int n, unsigned y){
return (x & ~(((1<<n)-1)<<(p-n))) | ((y&((1<<n)-1))<<(p-n));
}

segmentation :

  • 左半|

    • ((1<<n)-1)将向左移动 1 n 位,减 1 使所有位向右移 1。
    • <<(p-n)将它们向左移动 p-n
    • ~反转它们,将这些位保留为 0,将其他所有内容保留为 1
    • x &并将其发送到 x将这些位变为 0。
  • 右半边 |

    • ((1<<n)-1)同上
    • y &将只屏蔽那些位
    • <<(p-n)将这些位 p-n 向左移动
    • left | right将 OR 值组合在一起,以便:
      • n从位置 p 开始的位被设置到最右边ny , 留下 x 的其他部分不变

关于c - K&R练习2.6位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25324050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com