K&R C练习帮助(K&R C Exercise Help)

2019-08-05 14:07发布

我已经经历的K&R C编程语言的书,我卡上练习2-6其内容如下:

写的函数setbits(X,P,N,Y),其返回x与开始位置p处设置为Y的最右边的n位的n位,而使其他位不变。

我无法了解确切的事情,他们正在寻找我做的。 我看着一个可能的答案在这里 ,但我还是不太懂。 我认为这是一个的扔我送行的措辞。 任何人都可以或许解释他们在寻找什么我以不同的方式吗? 我希望不同的措辞会帮助我了解什么,我需要做明智代码。

Answer 1:

在阐述阿维的回答:

int i = setbits(0xAB = b10101011, 5, 3, 0xAA = b10101010);
i equals 0x93 = b10010011

说你的我=是0xAB。 在二元,这是:10101011

我们的号码每一个比特位置的。

Position #: 7   6   5   4   3   2   1   0
Bit:        1   0   1   0   1   0   1   1

最右边的位(最低显著)是位置“0”。 最左边的(最显著)是位“7”。

所以接下来的两个值,P和N,都在说:“你要修改n位起始位P”。 因此,如果P = 5和n = 3,你想在位数5开始,并在总您正在修改的3位。 这意味着在这个示例中的位5,4,3“101”。

Position #: 7   6   5   4   3   2   1   0
Bit:        1   0   1   0   1   0   1   1
                   |         |
                    ---------
               (Modifying these three bits)

我们该如何改变呢? 我们正在取代它们。 与另一组的3个比特。 从y中的三个最低显著位。

因此,这里的Y:

Position #: 7   6   5   4   3   2   1   0
Bit:        1   0   1   0   1   0   1   0 

和最右边的比特将是位2,1,0或值“010”。 当然,如果n = 6的价值,那么你想从我与“101010”替换那些六位 - 最右边的6位。

所以,你的任务是从我坐指定位 - 在这种情况下,“101” - 与y中的指定位取代他们 - “010”。

如果你这样做,那么你的返回值

1 0 1 0 1 0 1 0



Answer 2:

例如:

int i = setbits(0xAB = b10101011, 5, 3, 0xAA = b10101010);
i equals 0x93 = b10010011

我们把3个比特在X(101)的位置开始5,和从Y(010),以及最右端三个比特替换它们。



Answer 3:

这“可能的答案”是没有意见只是代码。 怪不得我帮不了你。

问题(也可能是应答者)假设你熟悉位字段。 这种事情是在你控制的硬件寄存器嵌入式编程非常普遍。

说有,设置了音量级,除其他事项外的寄存器。 也许,在同一时间,让您选择扬声器或麦克风之类的东西。 该位可能是这样的:

ssAAAmxx -每个字母表示数中的位域 。 要改变音量,你必须改变“AAA”的价值。 现在,让我们说你在你的程序的东西,可以让你调节音量。 这是一个简单的控制,它总是返回0和7的该格式看起来像这样之间的数字:

xxxxxAAA - 你的工作的话,就是从这个拿AAA位(称之为“Y”),并将它们设置成以上,这个数字(称之为“X”),在不改变不属于A的对位。 因此,这个问题会读,“以y的最右边3位,并将它们设置成X,从第5位(记住,他们从零数位),然后,在我们的例子3和5 N成为和P在原来的问题。



Answer 4:

该操作是“位域插入”

我们的想法是使y通常会比n位较少,但如果它不是,只是利用N。 在英语中,任务是为y插入到x开头为p,使用n个的视场宽度。



Answer 5:

n位取代的x,开始在P位置时,与y的最右边的n位。

大概你应该利用的getbits()例程第2.9章



Answer 6:

这个怎么样?

unsigned int
setbits(unsigned int x, int p, int n, unsigned int y)
{
    char buffer[65];

    unsigned x1 = x >> (p + 1);
    x1 <<= (p + 1);

    /*
     * x1 now contains all the bits before position 'p'.
     */

    unsigned x2 = y & ~(~0 << n);
    x2 <<= (p + 1) - n;

    /*
     * x2 now contains the rightmost 'n' bits of 'y', left shifted (p + 1) - n bits.
     */
    unsigned x3 = x & ~(~0 << ((p + 1) - n));

    /*
     * x3 now contains the rightmost (p + 1) - n bits.
     */

    return x1 | x2 | x3;
}


文章来源: K&R C Exercise Help