我已经经历的K&R C编程语言的书,我卡上练习2-6其内容如下:
写的函数setbits(X,P,N,Y),其返回x与开始位置p处设置为Y的最右边的n位的n位,而使其他位不变。
我无法了解确切的事情,他们正在寻找我做的。 我看着一个可能的答案在这里 ,但我还是不太懂。 我认为这是一个的扔我送行的措辞。 任何人都可以或许解释他们在寻找什么我以不同的方式吗? 我希望不同的措辞会帮助我了解什么,我需要做明智代码。
我已经经历的K&R C编程语言的书,我卡上练习2-6其内容如下:
写的函数setbits(X,P,N,Y),其返回x与开始位置p处设置为Y的最右边的n位的n位,而使其他位不变。
我无法了解确切的事情,他们正在寻找我做的。 我看着一个可能的答案在这里 ,但我还是不太懂。 我认为这是一个的扔我送行的措辞。 任何人都可以或许解释他们在寻找什么我以不同的方式吗? 我希望不同的措辞会帮助我了解什么,我需要做明智代码。
在阐述阿维的回答:
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
例如:
int i = setbits(0xAB = b10101011, 5, 3, 0xAA = b10101010);
i equals 0x93 = b10010011
我们把3个比特在X(101)的位置开始5,和从Y(010),以及最右端三个比特替换它们。
这“可能的答案”是没有意见只是代码。 怪不得我帮不了你。
问题(也可能是应答者)假设你熟悉位字段。 这种事情是在你控制的硬件寄存器嵌入式编程非常普遍。
说有,设置了音量级,除其他事项外的寄存器。 也许,在同一时间,让您选择扬声器或麦克风之类的东西。 该位可能是这样的:
ssAAAmxx -每个字母表示数中的位域 。 要改变音量,你必须改变“AAA”的价值。 现在,让我们说你在你的程序的东西,可以让你调节音量。 这是一个简单的控制,它总是返回0和7的该格式看起来像这样之间的数字:
xxxxxAAA - 你的工作的话,就是从这个拿AAA位(称之为“Y”),并将它们设置成以上,这个数字(称之为“X”),在不改变不属于A的对位。 因此,这个问题会读,“以y的最右边3位,并将它们设置成X,从第5位(记住,他们从零数位),然后,在我们的例子3和5 N成为和P在原来的问题。
我们的想法是使y通常会比n位较少,但如果它不是,只是利用N。 在英语中,任务是为y插入到x开头为p,使用n个的视场宽度。
n位取代的x,开始在P位置时,与y的最右边的n位。
大概你应该利用的getbits()
例程第2.9章
这个怎么样?
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;
}