我已经阅读了K&R C编程语言的书,我被困在练习2-6中,内容如下:
编写函数集位(x,p,n,y),返回x,从位置p开始到y的最右边的n位,而其他位不变。
我很难理解他们到底在找我做什么。我看了一个可能的答案,这里,但我仍然不太明白。我觉得这句话让我很不爽。有人能用不同的方式解释他们在找我做什么吗?我希望不同的措辞将帮助我理解我需要做什么代码明智。
发布于 2009-09-12 20:03:30
关于阿维的回答:
int i = setbits(0xAB = b10101011, 5, 3, 0xAA = b10101010);
i equals 0x93 = b10010011
假设你的I= 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“替换I中的六位--最右边的6位。
因此,您的任务是从i--在本例中为"101“--获取指定位,并将其替换为y- "010”中的指定位。
如果这样做,则返回值为
1 0 1 0 1 0
发布于 2009-09-12 19:18:02
例如:
int i = setbits(0xAB = b10101011, 5, 3, 0xAA = b10101010);
i equals 0x93 = b10010011
我们取从x (101)的位置5开始的3位,用y (010)中最右边的三位替换它们。
发布于 2009-09-12 19:34:41
“可能的答案”只是没有注释的代码。难怪它对你没有帮助。
这个问题(可能还有答案)假设您熟悉位字段。在控制硬件寄存器的嵌入式编程中,这种情况非常常见。
假设有一个寄存器来设置音频音量级别,以及其他的东西。同时,它也可以让你选择扬声器或麦克风之类的东西。这些数据可能如下所示:
ssAAAmxx --每个字母代表这个数字中的一个位字段。要更改卷,必须更改"AAA“的值。现在,让我们说,您的程序中有一些东西可以让您调整音量。它是一个简单的控件,它总是返回0到7之间的一个数字。
xxxxxAAA --那么,你的工作是从这里取AAA位(称为y ),并将它们设置为上面的数字(称为"x"),而不改变不是A的位。因此,问题会读到,“取y的最右边的3位,并将它们设为x,从位5开始(记住,它们从零开始计数)。然后,在我们的例子中,3和5在原来的问题中变成n和p。”
https://stackoverflow.com/questions/1415854
复制相似问题