主题:这程序里有条语句不懂 谁来指导下啊
june1c
[专家分:0] 发布于 2011-01-29 13:47:00
上面这个程序第二条语句中(p+1-n),不理解为什么是(P+1-n)??????
回复列表 (共1个回复)
沙发
windy0will [专家分:2300] 发布于 2011-01-29 16:16:00
您的代码不知道有没有问题?[code=c]
/* setbits : set n bits of x at position P with bits of y */
unsigned
setbits (unsigned x, int p, int n, unsigned y)
{
return x & (( 0 << n) << (p+1-n)) |
(y & ( 0 << n)) << (p+1-n);
}[/code]
把它改为下面这样,可能更容易理解
[code=c]
unsigned int
setbits (x, p, n, y)
unsigned int x, y;
unsigned char p, n;
{
return
(x & ~(((1 << n) -1) << p)) /* 把x从第p位开始的n位清零 */
| ((y & ((1 << n) -1))<< p); /* 把y的低n位左移至和x的第p位对齐*/
/*然后位或至x的相应位 */
}[/code]
下面的例子:
x = 0x000000aa(1010 1010); y= 0x00000006(0110);p = 1; n = 4;
((1U<<n) -1)表示的是 连续n个1,此时是0xf(1111).11110
~(((1U<<n) -1) <<p)把上面的值左移p位,然后求反,
为1111 1111 1111 1111 1111 1111 1110 0001.这样的结果是从第p位开始的n位
全部为0,其他位上全部为1.把这个值和x做&可以 把x从第p位开始的n位清零得
1010 0000.
((y & (((1U << n) -1))) << p)先提取y的低n位,得0110。然后把它左移,使这n位和
上面x被清零的n位对齐,得0 1100。
这样把0 1100 和上面得到的值 1010 0000 做位或运算有:
1010 1100.
这就是结果。
我来回复