回 帖 发 新 帖 刷新版面

主题:这程序里有条语句不懂 谁来指导下啊

上面这个程序第二条语句中(p+1-n),不理解为什么是(P+1-n)??????

回复列表 (共1个回复)

沙发

您的代码不知道有没有问题?[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.
这就是结果。

我来回复

您尚未登录,请登录后再回复。点此登录或注册