K&R C练习帮助

Kob*_*oby 7 c binary kr-c bit-manipulation

我一直在阅读K&R C编程语言书,我坚持练习2-6,内容如下:

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

我无法理解他们正在寻找我的确切事情.我在这里看了一个可能的答案,但我仍然不太明白.我认为这是让我失望的措辞.任何人都可以用不同的方式解释他们想要我做什么吗?我希望不同的措辞能帮助我理解我需要做的代码.

pou*_*def 12

阐述Avi的答案:

int i = setbits(0xAB = b10101011, 5, 3, 0xAA = b10101010);
i equals 0x93 = b10010011
Run Code Online (Sandbox Code Playgroud)

说你的i = 0xAB.在二进制文件中,这是:10101011

让我们对每个位位置进行编号.

Position #: 7   6   5   4   3   2   1   0
Bit:        1   0   1   0   1   0   1   1
Run Code Online (Sandbox Code Playgroud)

最右边的位(最不重要的)是位置"0".最左边(最重要的)是位置"7".

所以接下来的两个值p和n表示"你想要从位p开始修改n位".因此,如果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)
Run Code Online (Sandbox Code Playgroud)

我们如何修改它们?我们正在取代它们.使用另一组3位.来自y的三个最低有效位.

所以这是y:

Position #: 7   6   5   4   3   2   1   0
Bit:        1   0   1   0   1   0   1   0 
Run Code Online (Sandbox Code Playgroud)

并且最右边的位将是位2,1,0或值"010".当然,如果n = 6的值,那么你想要用"101010"替换i中的那6位 - 最右边的6位.

因此,您的任务是从i获取指定的位 - 在本例中为"101" - 并用y中的指定位替换它们 - "010".

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

1 0 1 0 1 0 1 0