gpt4 book ai didi

kernighan-and-ritchie - K&R 练习 2-6 真正要求什么功能?

转载 作者:行者123 更新时间:2023-12-04 08:39:29 29 4
gpt4 key购买 nike

Exercise 2-6. Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position p set to the rightmost n bits of y, leaving the other bits unchanged.



我一直试图在纸上弄乱这个功能一两个小时,但我一无所获。

我解释函数的方式是任意长度的位域 x 是查看它的 n位开始 p从最右边的位置。改这些 n位到位于 n 中的相同位任意长度的位域 y 中最右边的位。

示例: p = 7 n = 9 x为顶场,y为中场,结果为底场。

enter image description here

我无法确定如何使用任意大小的位字段执行此操作。我应该使用 sizeof(x) * 8或者这是不必要的?

我很感激您可以提供有关如何制作这样一个功能的任何提示。

我还想知道对练习的任何其他解释,可能是一个可能更容易的版本,尽管我确信这个版本可以完成。鉴于我花了多长时间,我希望能就此事提出第二意见,谢谢。

最佳答案

xy是整数,您知道位字段的大小不能大于整数中的位数。

由于这是C,假设最右边的位是#0,所以p = 0, n = 1表示替换 x 中最右边的位.

你想要做的是:

  • 创建位掩码——最右边的数字 n位设置为 1,其余所有位设置为 0;
  • 按位and带有 y 的位掩码提取最右边的 n y 的位并将其左移 p位;
  • 移动位掩码 p位以创建将在 n 上操作的位掩码从位置 p 开始的位;
  • 按位and带有 x 的逆移位位掩码屏蔽您要替换的位;
  • 按位or 2 和 4 的结果得到你的答案。

  • 滚动以在代码中查看它:

    int 位掩码 = ~((~0) << n);
    返回 ((位掩码 & y) << p) | (~(位掩码 << p) & x);

    关于kernighan-and-ritchie - K&R 练习 2-6 真正要求什么功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15698619/

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