【问题标题】:K&R's exercise 2-6: Do not understand input/outputK&R 的练习 2-6:不了解输入/输出
【发布时间】:2016-04-30 23:08:15
【问题描述】:

K&R 的练习 2-6:

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

这是我对示例输入/输出的解释:

unsigned x = 315;
int p = 2;
int n = 3;
unsigned y = 9;
printf("%d\n", setbits(x, p, n, y));  // 295

这是我的推理。

位置 2 的 3 位 315:

0000 0001 0011 1011
             - --    

9 的最右边 3 位:

0000 0000 0000 1001
                ---

将 9 的最右边 3 位设置为 315 => 295 从 2 开始的 3 位:

0000 0001 0010 0111
             - --

我写了一些代码,然后想对照其他解决方案检查它,for example。我在网上找到的两个都给出了不同的答案,313:

0000 0001 0011 1001
                --- ???

我错过了什么?

【问题讨论】:

  • 索引在 C 中从零开始。推测“位置 2”是第三位。
  • 没有minimal reproducible example,就无法诊断您的代码。
  • 好的,我想知道这一点并尝试了两种方式。我已经编辑了我的问题以反映正确的定位,但这对我来说仍然没有意义。
  • @Olaf,我实际上只是在询问输入/输出。我对 expected 答案应该是什么的推理是错误的呢?

标签: c bit-manipulation


【解决方案1】:

问题的说明有点模棱两可。你在翻译 “从位置 p 开始的 n 位”表示位 p、p+1、...、p+n-1。 您链接到的页面似乎说从位置 p 开始的 n 位 是位 p, p-1, ..., p-n+1。 所以从第 2 位开始的 3 位将是第 2、1、0 位,最右边的 3 位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多